Docker概述

Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。

Docker是通过内核虚拟化技术(namespace以及cgroups等)来提供容器的资源隔离与安全保障。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机( VM)额外的操作系统开销,提高资源利用率。

原理:

建立====》传送====》运行

架构:

C/S架构

组件:

镜像(Image)

容器(Container)

仓库(Repository)

与VM的区别

docker与Openstack的对比

Docker能干嘛

简单配置、代码流水线管理、开发效率、应用隔离、服务器整合、调试能力、多租户、快速部署

Docker改变了什么?

面向产品:产品交付

面向开发:简化环境配置

面向测试:多版本测试

面向运维:环境一致性

面向架构:自动化扩容

Docker的部署安装

环境准备

yum install -y docker
systemctl start docker
systemctl enable docker

镜像的查看

[[email protected] ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/centos     latest              60e65a8e4030        36 hours ago        196.6 MB
docker.io/nginx      latest              813e3731b203        9 days ago          133.8 MB
docker.io/registry   latest              a8706c2bfd21        2 weeks ago         422.8 MB

镜像仓库             标签                  镜像ID              创建时间            镜像大小

镜像的下载、导出和导入

[[email protected] ~]# docker save centos > /opt/centos.tar.gz
[[email protected] ~]# docker load < /opt/centos.tar.gz
[[email protected] ~]# docker pull centos

这次咱们做实验需要三个镜像: nginx、centos、registry

镜像的删除

docker:命令     rmi:参数    后面

[[email protected] ~]# docker rmi 813e3731b203

你的第一次(创建容器)

[[email protected] ~]# docker run centos /bin/echo "hehe"
hehe

命令解读:使用centos镜像,run执行命令,使用echo命令输出hehe

查看容器状态

可以使用docker ps只能看见存活的容器,docker ps  -a 查看全部的容器

容器ID     使用的镜像     执行的命令     创建的时间  状态   端口   名称(如果不指定,自动生成)

[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
daeb4d7f7aab        centos              "/bin/echo hehe"    About a minute ago   Exited (0) About a minute ago                       insane_einstein

创建容器

--name:指定容器名称

-t         :分配一个tty终端

-i         :容器的标准输保持打开的状态

[[email protected] ~]# docker run --name mydocker -t -i centos /bin/bash
[[email protected] /]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  11772  1872 ?        Ss   03:42   0:00 /bin/bash
root         14  0.0  0.0  35888  1472 ?        R+   03:43   0:00 ps aux

这种方式创建自动进入容器,开启的容器只执行/bin/bash;

在容器中查看主机名

[[email protected] /]# hostname
94ab7a046f7c
[[email protected] /]# exit

启动、停止容器

[[email protected] ~]# docker stop  ID
[[email protected] ~]# docker start  ID

进入容器

方式一:

[[email protected] ~]# docker attach 94ab7a046f7c
[[email protected] /]#

方式二:

先获取进程的PID然后在通过pid进入容器

[[email protected] ~]# docker inspect --format "{{.State.Pid}}" 94ab7a046f7c
4101
[[email protected] ~]# nsenter -t 4101 -u -i -p

[[email protected] opt]# nsenter --help
 -t, --target <pid>     target process to get namespaces from
 -m, --mount [=<file>]  enter mount namespace
 -u, --uts   [=<file>]  enter UTS namespace (hostname etc)
 -i, --ipc   [=<file>]  enter System V IPC namespace
 -n, --net   [=<file>]  enter network namespace
 -p, --pid   [=<file>]  enter pid namespace
 -r, --root  [=<dir>]   set the root directory
 -w, --wd    [=<dir>]   set the working directory
 -F, --no-fork          do not fork before exec‘ing <program>

通过脚本实现进入容器

#/bin/sh
PID=$(docker inspect --format "{{.State.Pid}}" $1)
nsenter -t $PID -p -i -u -n

删除容器

[[email protected] ~]# docker rm ID/名称
加-f 强制删除,包括正在运行中的容器

映射

随机映射

端口的映射是系统自动分配的?

[[email protected] ~]# docker run -d -P nginx
90316d97ee975b4e62e1927a9fb31f20703556b1a3ea07880d0c68dcb5bbd3bb
[[email protected] ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                           NAMES
90316d97ee97        nginx               "nginx -g ‘daemon off"   25 seconds ago      Up 23 seconds       0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp   ecstatic_almeida

指定映射

指定端口的映射

[[email protected] ~]# docker run -d -p 81:80 nginx
0294a8f5b4fc81ba31383a8eb98ec62b136826eba92360c84afd87bf1bf819fc
[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                           NAMES
0294a8f5b4fc        nginx               "nginx -g ‘daemon off"   11 seconds ago      Up 10 seconds       443/tcp, 0.0.0.0:81->80/tcp                     admiring_ramanujan

查看日志

[[email protected] ~]# docker log +ID

数据管理

数据卷

默认挂载目录

创建一个数据卷,名称是volume-test1,挂载到data下默认挂载目录

[[email protected] ~]# docker run -it --name volume-test1 -v /data centos
[[email protected] /]# ls -l /data/
total 0

打开一个新的窗口

列出容器的所有信息,查看mounts模块

[[email protected] ~]# docker inspect 1768d6414cfc
 "Mounts": [
        {
            "Name": "55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167",
            "Source": "/var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data",
            "Destination": "/data",
            "Driver": "local",
            "Mode": "",
            "RW": true
        }
    ],

查找挂载点并进入

查看挂载的位置
[[email protected] ~]# ll /var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data
总用量 0
进入到挂载点
[[email protected] ~]# cd /var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data

创建一个cgt测试,并重新回到容器中查看

[[email protected] _data]# mkdir cgt

去容器中查看
[[email protected] /]# ls -l /data/
total 4
drwxr-xr-x 2 root root 4096 Jan  4 14:04 cgt

指定挂载目录

将/opt挂载到/opt目录下
[[email protected] ~]# docker run -it --name volume-test1 -v /opt:/opt centos

指定权限

只需要在挂载后面加上权限即可。

加读写rw;只读ro

[[email protected] ~]# docker run -it --name volume-test1 -v /opt:/opt:rw centos

挂载单个文件

记录历史记录

[[email protected] ~]# docker run -it -v ~/.bash_history:/.bash_history centos

数据卷容器

让一个容器可以访问另一个容器的数据卷

启动两个容器

启动nfs容器,挂在一个卷,使用-d直接在后台执行
[[email protected] ~]# docker run -d --name nfs -v /data centos
209bc89b365ad6bc1eeae693ada01c04c2d08e9ee2b8816e624882944c116126

启动test1容器,挂载到nfs的数据卷容器上,
[[email protected] ~]# docker run -it --name test1 --volumes-from nfs centos
[[email protected] /]# ls /data/
查看没内容

找到nfs容器的挂载点

(可以使用名称,不仅仅是ID)

找到nfs容器的ID
[[email protected] opt]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                     PORTS               NAMES
209bc89b365a        centos              "/bin/bash"         2 minutes ago        Exited (0) 2 minutes ago                       nfs
找到nfs容器的挂载点
[[email protected] _data]# docker inspect nfs
[[email protected] opt]# cd /var/lib/docker/volumes/3938c9b1143d41340e148a4c7bc12d13b53966b15380c5b958a9e035897450d5/_data
[[email protected] _data]# touch cgt

在test1上查看

到test1上查看
[[email protected] /]# ls /data/
cgt

点睛:数据卷容器不论停止还是开启,不影响其他容器挂载使用

如何制作镜像

方式一:手动构建容器

1:创建一个容器mynginx,使用centos镜像

[[email protected] ~]# docker run --name mynginx -it centos
[[email protected] /]# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
[[email protected] /]# yum -y install nginx
[[email protected] /]# exit
exit

2:基于mynginx容器做一个镜像mynginx:v1

[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
f9c7dfb6f552        centos              "/bin/bash"         3 minutes ago       Exited (0) 15 seconds ago                       mynginx
基于mynginx这个容器做一个镜像
[[email protected] ~]# docker commit -m "my nginx" f9c7dfb6f552 cgt/mynginx:v1
3f3adc859b77b2b47c3631229761bee6c7066f1c708bc01c5173c2ef5c0adce8
提交镜像,同时打一个标签叫mynginx:v1,cgt相当于你向github上提交的用户名

查看镜像
[[email protected] ~]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
cgt/mynginx                          v1                  3f3adc859b77        About a minute ago   326.4 MB

3:基于mynginx:v1创建一个容器mynginxv1

目的是修改nginx不让其在后台运行

[[email protected] ~]# docker run -it --name nginxv1 cgt/mynginx:v1
[[email protected] /]# vi /etc/nginx/nginx.conf
daemon off;      # 不再后台运行
[[email protected] /]# exit
exit

[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
ea64c5855006        cgt/mynginx:v1      "/bin/bash"         2 minutes ago       Exited (0) 42 seconds ago                       nginxv1

4:基于mynginxv1提交mynginxv2版本

重新提交V2版本
[[email protected] ~]# docker commit -m "my nginx" ea64c5855006  cgt/mynginx:v2
a480cdf9055ec4e640c65df6404c6ba42903ea77198a26cec75eef0e4965fe67
查看V2镜像
[[email protected] ~]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
cgt/mynginx                          v2                  a480cdf9055e        25 seconds ago

5:基于mynginxv2镜像,创建mynginxv2容器

启动容器,-d后台运行,-p指定端口 在后面是镜像,最后是命令(因为是yum安装的,可以直接写nginx,如果不是yum,那要写绝对路径)
[[email protected] ~]# docker run -d -p 82:80 cgt/mynginx:v2 nginx
4eaf8a19034a673100f9355504628fad45e6ecbab91615afd6cb4e7a18b82171

[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
4eaf8a19034a        cgt/mynginx:v2      "nginx"             15 seconds ago      Up 14 seconds       0.0.0.0:82->80/tcp   elegant_leakey
可以在浏览器访问82端口

方式二:Dockerfile

1:Dockerfile包含的信息

基础镜像信息 
    维护者信息 
    镜像操作指令 
    容器启动时执行指令

2:文件的编写

[[email protected] ~]# mkdir /opt/dockerfile/nginx/ -p
[[email protected] ~]# cd /opt/dockerfile/nginx/
将index.html上传到此处
[[email protected] nginx]# vim Dockerfile
# This is docker file
# version v1
# Author caoxiaojian
# Base image(基础镜像)
FROM centos

# Maintainer(维护者信息)
MAINTAINER caoxiaojian  [email protected]

# Commands(执行命令)
RUN rpm -ivh  http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum -y install nginx
# Add(添加文件)
ADD index.html /usr/share/nginx/html/index.html    # index.html是自己编写的文件,放在后面的目录中,因为yum安装后Documentroot是在这里
RUN echo "daemon off;" >>/etc/nginx/nginx.conf
EXPOSE 80           # 对外的端口
CMD [‘nginx‘]       # 执行的命令

3:构建容器,并运行

建立newnginx容器,-t:标签,执行/opt/dockerfile/nginx/下面的默认的Dockerfile文件
[[email protected] nginx]# docker build -t cgt/mynginx:v3 /opt/dockerfile/nginx/

[[email protected] nginx]# docker run -d -p 83:80 cgt/mynginx:v3

友好链接:http://itgladiator.github.io/%E6%9E%B6%E6%9E%84/2015/06/06/Docker%E5%AD%A6%E4%B9%A0.html
时间: 2024-08-10 01:53:31

Docker概述的相关文章

Docker概述与安装(官网译)

1.Docker概述 原文地址:https://docs.docker-cn.com/engine/docker-overview/#docker-engine Docker是一个开发,集装,运行应用程序的开放平台.Docker使您可以将应用程序与基础架构分离,以便快速交付软件.使用Docker,您可以像管理应用程序一样管理基础架构.通过利用Docker的方法快速集装,测试和部署代码,您可以显着减少编写代码和在生产中运行代码之间的延迟. 2.Docker平台 Docker提供了在称为容器的松散隔

容器管理之--Docker概述

1.Docker概述Docker是使用最广泛的开源容器引擎,一种操作系统级别的虚拟化技术,依赖linux内核特性,一个简单的引用程序打包工具.2.Docker组成Docker Client 客户端Docker Daemon Docker ImagesDocker ContainerDocker Registry3.容器VS虚拟化 container VM 启动级别 秒级 分钟级 运行性能 接近原生系统 5%左右损耗 磁盘占用 MB GB 数量 成百上千 几十台 隔离性 进程级 系统级,更彻底 操

docker概述&amp;花式安装

docker概述: 什么是Docker? Docker是一种Linux容器技术,一种高效.敏捷.和轻量级的容器解决方案,并且支持在多种主流平台(PaaS)和本地部署.Docker是基于Go语言实现的云kai源项目,诞生于2013年,最初发起者是DotCloud公司,后来改名为DockerInc,之后专注于Docker相关技术和产品的kai发.Docker项目目前已经加入了Linux基金会,遵循Apache2.0kai源协议,全部kai源dai码均在https://github.com/docke

docker概述和基本命令

容器技术已经成为应用程序封装和交付的核心技术 ?  容器技术的核心有以下几个内核技术组成: –  CGroups(Control Groups)-资源管理 –  NameSpace-进程隔离 –  SELinux安全 ?  由于是在物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速 Docker是完整的一套容器管理系统 ?  Docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术 Docker特性 Docker优点: 削减高峰,填堵低峰 相比于传统的虚

五十三.Docker概述、部署Docker、Docker镜像、Docker基本命令

1.安装Docker 准备两台虚拟机,IP为192.168.1.10和192.168.1.20 安装docker-engine 和 docker-engine-selinux 关闭防火墙 ************************************** 配置两台虚拟机: 创建两台虚拟机后端盘: images] qemu-img create -f qcow2 -b node.qcow2 docker1.img 50G images] qemu-img create -f qcow2

docker概述与安装及运行容器

传统虚拟化 传统虚拟化步骤 1.安装虚拟化软件以及虚拟化的管理软件 2.创建虚拟机 3.给虚拟机安装os 4.在虚拟机内部不是应用(http.db之类的应用) 传统虚拟化的特点 1.VM与VM之间是完全隔离的,并且虚拟机必须要安装os 2.应用所运行的环境是建立在操作系统之上的 3.应用迁移非常笨重 传统虚拟化已经无法满足当前敏捷开发方式,VM的方式会导致开发环境和生产环境不一致,版本测试完成之后需要重新搭建环境. docker docker是容器的引擎工具,最主要是管理容器的生命周期,创建容器

Docker(1)--概述

Docker概述 Docker是一个用于开发,交付和运行应用程序的开放平台.Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件.借助Docker,您可以以与管理应用程序相同的方式来管理基础架构.通过利用Docker的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟. Docker平台 Docker提供了在松散隔离的环境(称为容器)中打包和运行应用程序的功能.隔离和安全性使您可以在给定主机上同时运行多个容器.容器是轻量级的,因为它们不需要虚拟机

【原创】Docker容器及Spring Boot微服务应用

Docker容器及Spring Boot微服务应用 1 什么是Docker 1.1 Docker的出现 问题一:项目实施环境复杂问题 传统项目实施过程中经常会出现“程序在我这跑得好好的,在你那怎么就不行呢?! ” 这是一个典型的应用场景,Docker image中包含了程序需要的所有的运行时依赖,比如java的程序,肯定要在image中包含jdk:比如Python的程序,肯定要在image中包含对应版本的Python解释器.Docker把整个运行时环境打包放到image中,所以搞定了环境依赖问题

Docker实用指南:将Python Web应用容器化

Docker实用指南:将Python Web应用容器化 提供 Zstack社区 前言 Web应用随时可能被攻击者利用来夺取整个主机的权限,这是很常见也是很恐怖的一件事.为了更高的安全性,就需要将不同应用之间进行隔离(尤其是在这些应用属于不同的用户的情况下),然而这种隔离的实现一直是个挑战.到目前为止,隔离性的实现方法已经有了很多,然而它们要么太过昂贵(时间的层面以及资源的层面),要么太过复杂(无论对开发者还是对管理员). 本文将讨论如何让"容器化"的Python Web应用跑在安全的沙