Docker入门基础

1、离线环境安装dockerpython

本实验安装环境以下:linux

l  Centos Linux release 7.5.1804web

blob.png

l  docker-ce-18.06.1.ce-3.el7.x86_64docker

可用下载地址:https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/数据库

       安装步骤:json

1.         挂载系统安装镜像,制做本地yumbootstrap

mount /dev/sr0 /mnt/vim

vim /etc/yum.repos.d/localiso.repo后端

[base]centos

name=CentOS-$releasever - Base

baseurl=file:///mnt

gpgcheck=0

2.         安装docker

yum localinstall -y docker-ce-18.06.1.ce-3.el7.x86_64.rpm

3.         验证docker安装成功

l  docker version               ####检查docker版本

blob.png

docker info                     ###检查docker系统信息

blob.png

systemctl status docker                        ###检查docker服务状态

blob.png

2、使用febootstrap制做操做系统的docker镜像

Centos7的系统镜像中没有febootstrap安装包,能够挂载centos6的系统镜像,使用yum安装febootstrap,使用以下命令能够制做操做系统的docker镜像所需的文件(假如操做系统镜像文件在本地文件系统上)

febootstrap -i bash -i openssh-server -i openssh-clients centos75 centos75-installDir file:///mnt

###-i    要在镜像中安装的软件,本例中安装了bashssh-server

####centos75     镜像的名称

####centos75-installDir          生成的镜像文件的存放目录

####file:///mnt             操做系统镜像的连接,若是是基于互联网的镜像源,能够指定为相似http://iso.repo/iso格式

此命令执行成功后,会在指定的目录centos75-installDir中生成相似于linux操做系统文件的目录

blob.png

执行如下命令,将生成的操做系统镜像文件导入到docker中成为image

tar -c . | docker import - centos75

导入为镜像以后,执行docker images命令查看已有的镜像信息

blob.png

执行如下命令运行刚才生成的镜像,-t指定docker生成交互的伪终端,i指定和docker容器交互:

docker run -ti centos75:7.5 bash

blob.png

3、Docker经常使用命令

l  docker pull centos:latest            ####拉取镜像,默认从docker hup拉取

l  docker images                     ###列出本地已经存在的image

l  docker tag centos75:7.5 centos-tagtest:7.5          ##给镜像centos75:7.5添加新的仓库标签,以后可使用原来的标签和新的标签同时访问镜像,镜像名称只能小写字母

    blob.png

l  docker inspect centos75:7.5          ###查看镜像的详细信息,返回的结果为json格式,可使用-f获取指定的项

blob.png

l  docker rmi centos75-tagtest:7.5           ###使用镜像标签删除镜像,当同一个镜像(同一个镜像id)有多个标签时,若是不是最后一个标签,经过标签删除镜像,只是删除了镜像对应的镜像标签,不会影响镜像文件。当镜像只有一个标签是=时,删除最后一个标签会删除整个镜像。

l  docker rmi 03f8a5cba27d              ##使用镜像id删除镜像,此时会先尝试删除此镜像指向的全部标签,而后删除该镜像文件自己。若是镜像有运行中的容器,默认不容许删除。可使用-f强制删除,可是不建议使用此参数

blob.png

l  docker commit -p -m "add a new file:/testCreateImage" 9dc62934a4b1 new-test-image:1            ####基于一个运行中的容器生成新的镜像

l  docker save –o imgae.tar centos75:7.5           #####将镜像保存为本地文件

l  docker load  --input imgae.tar   || docker load < image.tar           ####经过本地文件导入镜像到本地镜像库

l  cat image.tar | docker import  –  image:latest           ###从本地模板导入镜像

l  docker tag image:lastest image:7.5             ##为镜像更改标签

l  docker create –it centos:7.5           ###建立docker容器,create命令建立的容器处于中止状态,可使用docker start启动,建立容器支持不少选项,具体能够查看help

l  docker run –it –d centos:7.5 bash         ###等价于create而后start,使用run建立并启动容器包含如下过程:

Ø  检查本地是否存在指定的镜像,若是不存在,从默认的公共镜像源下载镜像

Ø  利用镜像建立一个容器,并启动该容器

Ø  分配一个文件系统给容器,并在只读的镜像层外面挂载一个可读写层

Ø  从宿主主机中配置的网桥接口中分配一个虚拟接口到容器

Ø  从网桥的地址池中分配一个ip给容器

Ø  执行用户指定的应用程序

Ø  执行完毕后容器被自动终止

-t选项让docker分配到一个伪终端并绑定到容器的标准输入,用户能够经过此终端和容器交互

-i选项让容器的标准输入保持打开

-d选项让容器以守护态运行。

docker容器中指定的应用终结时,容器也会自动终止,容器会马上处于stopped状态,可使用start命令来从新启动。

l  docker stop  [–t|--time=10] centos:7.5          ###终止一个容器。首先向容器发送sigterm信号,等待一段超时时间(10s)后再发送sigkill信号强制终止;docker kill直接发送sigkill信号

blob.png

l  使用-d选项后,容器会进入后台,用户没法看到容器中的信息,也没法操做容器,此时,可经过如下方式进入容器进行操做:

Ø  docker attach –detach-keys=CTRL-P –no-stdin CONTAINER ID         

--detach-keys          ##指定退出attach模式的快捷键,默认先ctrl+p而后ctrl+q

--no-stdin         ###是否关闭标准输入,默认保持打开

此方法,多个窗口同时链接到一个容器时,全部窗口同步显示,一个窗口被阻塞,会致使其余窗口也被阻塞

blob.png

Ø  docker exec [-d|--detach] [--detach-keys=[]] [-i] [-t] [-u|--user=[USER]] [--privileged=true|false] CONTAINER ID COMMAND ARGS

blob.png

l  docker rm CONTAINER ID       ##删除容器

l  docker export [-o|--output=FILE] CONTAINERID  || docker export CONTAINERID > FILE             ##导出容器到一个文件,不管容器是否运行均可以导出,实现容器迁移,经过docker loaddocker import导入容器实现容器迁移

4、Docker数据管理

Docker容器中数据管理主要有2种方式:

l  数据卷Data Volume

l  数据卷容器Data volume Container

1.         数据卷Data Volume

Data volume是宿主机上的一个可供容器使用的特殊的目录,它将宿州os上的系统目录直接映射到容器中,挂载给容器系统使用,能够提供以下特性:

n  数据卷能够在容器之间共享和重用,容器间传递数据将变得高效方便

n  对数据卷内容的修改会立马生效,不管是本地操做仍是容器操做

n  对数据卷的修改不会影响镜像,解耦了应用和数据

n  卷会一直存在,直到没有容器使用,能够安全的卸载

建立包含数据卷的容器:

docker create -t -i  -v /webdir centos75:7.5 bash

建立包含数据卷的容器以后,经过docker inspect查看容器详细信息,能够看到挂载的数据卷对应的本地地址:blob.png

blob.png

指定容器数据卷对应的本地位置:

docker create -t -i -v /docker:/webapp --name t1 -P centos75:7.5 bash

经过docker inspect查看挂载的数据卷得信息,将本地os目录/docker挂载给了容器的/webapp目录,权限为RW

blob.png

使用以下命令可将本地目录挂载为只读的数据卷:

docker create -t -i -v /docker:/webapp:ro --name  t1 -P centos75:7.5 bash

一个容器能够将一个本地目录挂载给容器的多个目录,不一样的容器也能够挂载同一个目录,此状况下,不管是在容器中仍是在本地,对目录的更改都会当即体现到全部容器或本地文件系统

2.         数据卷容器Data Volume Container

数据卷容器是一个容器,是专门用来提供数据卷供其余容器挂载。在一个容器A中使用数据卷,在其余容器中可以使用--volumes-from参数挂载容器A中的全部数据卷。

使用以下命令建立数据卷容器,挂载本地目录/docker分别到容器的/webroot/webapp目录:

docker run -ti -d -v /docker/:/webroot -v /docker/:/webapp centos75:7.5 bash

blob.png

建立一个新的容器,使用参数--volumes-from挂载数据卷容器中的数据卷:

docker run -i -t -d --volumes-from bd7 centos75:7.5 bash

blob.png

能够看到,挂载了数据卷容器中的数据卷的容器,只是挂载了和数据卷容器中同样的目录,数据卷容器自身不须要一直处于运行状态:

blob.png

最新的数据卷(容器)管理docker提供了docker volume命令,经过docker create –mount选项,docker提供了更多的高级挂载选项:

blob.png

docker数据卷挂载原则:

n  挂载一个空目录到容器的非空目录,容器非空目录中的内容将被隐藏

5、端口映射与容器互联

容器中运行服务,须要向外提供服务的场景下,须要将容器的ip和相关端口曝露在外让外部地址访问。docker提供了2种方式来知足外部访问容器应用的方式:

l  映射容器内端口到宿主主机的端口

l  容器互联机制实现多个容器间经过容器名来互相访问

1.         映射容器内端口到宿主主机的端口

容器启动以后,系统会自动分配IP地址给容器。从宿主机的docker0的桥接网卡上能够访问容器的IP地址。宿主机以外的系统没法访问容器的ip和端口,只能经过访问宿主机NAT以后的IP和端口。docker rundocker create-P/p选项能够将容器曝露的端口映射为宿主机上的端口,在宿主机以外的系统上能够经过访问宿主机的IP和相关端口(NAT后)访问容器提供的服务。

如下命令将docker容器的8022端口分别映射到宿主机的802222端口,在容器中启动httpd,访问宿主机的80端口能够访问容器提供的web服务,访问宿主主机的2222端口能够访问到容器的22端口:

docker run -d -p 2222:22 -p 80:80 -v /mnt:/mnt centos75-httpd-sshd /usr/sbin/sshd –D

blob.png

blob.png

blob.png

如下格式能够映射指定IP地址而不是宿主机的全部IP地址:

-p 127.0.0.1:80:80

-p 127.0.0.1:123:123/udp

-p 127.0.0.1::80

如下命令能够查看容器映射的端口详情,或者使用docker inspect也能够查看映射状况:

docker port 2c

blob.png

blob.png

2.         容器互联机制实现多个容器间经过容器名来互相访问

建立一个数据库容器:

docker run –d --name db postgres

建立新的容器,将它链接到db容器:

docker run -d -P --name web --link db:db image python web.py

--link参数格式为--link name:aliasname表示要链接的容器名称,alias是这个链接的别名

6、Docker网络管理

Docker容器网络利用了Linux虚拟网络技术,目前支持5中网络模式(libnetwork5种内置网络驱动)

l  bridge驱动,默认驱动。此驱动为Docker的默认设置驱动,使用这个驱动的时候,libnetwork将建立出来的Docker容器链接到Docker网桥上。做为最常规的模式,bridge模式已经能够知足Docker容器最基本的使用需求了。然而其与外界通讯使用NAT,增长了通讯的复杂性,在复杂场景下使用会有诸多限制。

l  host驱动,libnetwork将不为Docker容器建立网络协议栈,即不会建立独立的network namespaceDocker容器中的进程处于宿主机的网络环境中,至关于Docker容器和宿主机共同用一个network namespace,使用宿主机的网卡、IP和端口等信息。可是,容器其余方面,如文件系统、进程列表等仍是和宿主机隔离的。host模式很好地解决了容器与外界通讯的地址转换问题,能够直接使用宿主机的IP进行通讯,不存在虚拟化网络带来的额外性能负担。可是host驱动也下降了容器与容器之间、容器与宿主机之间网络层面的隔离性,引发网络资源的竞争与冲突。

l  overlay驱动。此驱动采用IETE标准的VXLAN方式,而且是VXLAN中被广泛认为最适合大规模的云计算虚拟化环境的SDN controller模式。在使用过程当中,须要一个额外的配置存储服务,例如Consuletcdzookeeper。还须要在启动Docker daemon的时候额外添加参数来指定所使用的配置存储服务地址。

l  remote驱动。这个驱动实际上并未作真正的网络服务实现,而是调用了用户自行实现的网络驱动插件,使libnetwork实现了驱动的可插件化,更好地知足了用户的多种需求。用户只须要根据libnetwork提供的协议标准,实现其所要求的各个接口并向Docker daemon进行注册。

l  null驱动。使用这种驱动的时候,Docker容器拥有本身的network namespace,可是并不为Docker容器进行任何网络配置。也就是说,这个Docker容器除了network namespace自带的loopback网卡名,没有其余任何网卡、IP、路由等信息,须要用户为Docker容器添加网卡、配置IP等。这种模式若是不进行特定的配置是没法正常使用的,可是优势也很是明显,它给了用户最大的自由度来自定义容器的网络环境。

Ø  默认状况下,docker安装成功以后,docker daemon会建立在3个网络,分别是bridge,hostnone,分别使用bridge,hostnull驱动,这3种内置的默认网络是没法使用docker network rm进行删除的:

blob.png

Ø  使用以下命令建立和删除network,默认驱动为bridge,可经过-d host指定驱动类型为host,或经过-d指定其余网络类型(host,overlay,null,remote)

docker network create frontend

docker network rm frontend

blob.png

建立bridge类型的network后,会在host上生产对应的bridgebridge名称为br-networkID

blob.png

blob.png

Ø  使用以下命令运行一个容器,没有指定链接哪一个network,默认链接到名为bridgenetwork上,会在host上生成veth的网卡,查看bridge信息,能够看到此veth接口链接在默认的docker bridge上面,若是容器未运行,主机上不会存在容器对应的网卡:

docker run -it -d 35b925abf710 bash

blob.png

Ø  使用以下命令运行一个容器,指定容器的网卡链接到backend这个network上,能够看到容器的后端网卡链接到了新的bridge

docker run -it -d --network backend 35b925abf710 bash

blob.png

blob.png

登录到容器中查看容器的IP地址,能够看到链接到不一样bridge的容器网卡,分配了不一样网段的IP地址,彼此没法通讯

blob.png

Ø  经过如下命令能够为容器添加网卡,并指定链接到特定的network

docker network connect bridge 19226ae822cf

blob.png

Ø  建立或运行容器时指定IP地址--ip

此场景只有在用户自定义网络的状况下支持

blob.png

 

7、docker私有镜像仓库管理

centos7系统中可经过安装docker-registry包构建私有镜像仓库,docker-registry安装以后会生成/etc/docker-distribution/registry/config.yml配置文件,经过如下命令启用私有镜像仓库服务:

registry serve /etc/docker-distribution/registry/config.yml >> /var/log/docker-registry.log 2>&1 &

服务启动以后会默认监听5000端口提供服务:

blob.png

执行如下命令检查registry服务是否正常:

curl http://9.38.91.200:5000/v2/_catalog

blob.png

 

8、Dockerd相关参数

l  dockerd默认配置文件:/etc/systemd/system/docker.service.d/docker.conf

l  dockerd服务端默认监听本地的unix:///var/run/docker.sock套接字,要指定监听的TCP/IP协议栈上,可使用dockerd的启动选项: -H, --host=[unix:///var/run/docker.sock]: tcp://[host:port] to bind or unix://[/path/to/socket] to use.

l  docker客户端默认经过本地unix:///var/run/docker.sock套接字向服务端发送命令

l  新版本的docker daemon进程为/usr/bin/dockerd,只负责提供对客户端API的支持;容器生命周期管理单独放到docker-containerd中进行管理,防止dockerd进程异常时对容器的影响。

没有运行任何容器时,系统运行dockerd进程:

blob.png

启动容器以后,系统会启一个新的docker-containerd-shim进程管理维护容器生命周期:

blob.png

l  docker daemon默认容许同一个bridge内的容器及主机互相通讯,能够经过dockerd选项禁止容器间通讯:--icc=true|false.

容器之间须要通讯,能够经过link的方式进行通讯

blob.png

l  设置容器内MTU,默认为0,在容器内为1500--mtu=0

l  dockerd的启动选项--dns=IPADDR指定使用指定的默认DNS服务器,此参数也能够在容器运行时指定。默认配置以下:

blob.png

l  dockerd的启动选项--dns-search=DOMAIN指定容器的默认搜索域,也能够在容器建立或运行时指定

容器运行或建立时的选项:

-h OR --hostname=HOSTNAME    ##配置容器主机名

9、docker-compose使用方法

docker官方推出的复杂系统编排工具,能够灵活的对各类容器资源实现定义和管理,快速建立和管理基于docker容器的应用集群。

docker-compose经过一个单独的docker-compose.yml模板文件来定义一组相互关联的应用容器做为一个项目,其中包含2个概念:

n  服务service:一个应用的容器,能够包含为若干运行相同镜像的容器实例

n  项目project:一组相互关联的应用容器组成的一个完整业务单元。

 

10、常见问题

1.       docker容器中的服务使用systemctl命令时报错:Failed to get D-Bus connection: Operation not permitted

【问题缘由】:容器不支持完整的service management system,管理服务的时候建议直接使用service daemo操做

2.         使用以下CMD经过dockerfile build httpd镜像

CMD ["/usr/sbin/httpd",”-D”,” FOREGROUND”]

相关文章
相关标签/搜索