zhouying23 发表于 2019-2-21 08:07:06

Docker容器学习整理

  一、使用Docker镜像
1.1 docker常用命令
1.2 创建镜像
1.3 存出和载入镜像
1.4 上传镜像
  二、操作docker容器
2.1 创建容器
2.2 终止容器
2.3 进入容器
2.4 删除容器
2.5 导入和导出容器
  三、访问Docker仓库
  一、docker基本管理
1.1 docker常用命令
1.1.1 docker images# 列出本机已有镜像
1.1.2 tag命令添加镜像标签
1.1.3 docker inspect 查看镜像详细信息
1.1.4 history 查看镜像历史
1.1.5 docker search 搜索镜像
1.1.6 docker rmi 删除镜像
  1.1.1 docker images 命令详解:
  列出镜像:

# docker images
REPOSITORY          TAG               IMAGE ID            CREATED             SIZE
docker.io/centos    latest            5182e96772bf      7 days ago          200 MB
docker.io/nginx   latest            c82521676580      2 weeks ago         109 MB

  常用参数:

-a , —all=true|false   # 列出所有的镜像文件(包括临时文件),默认为否;
—digests=true|false    # 列出镜像的数字摘要值,默认为否;
-q , —quiet=true|false# 仅输出ID信息,默认为否
  —digests=true|false    # 列出镜像的数字摘要值,默认为否;

# docker images --digests
REPOSITORY          TAG               DIGEST                                                                  IMAGE ID            CREATED             SIZE
docker.io/centos    latest            sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf   5182e96772bf      7 days ago          200 MB
docker.io/nginx   latest            sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424   c82521676580      2 weeks ago         109 MB
-q , —quiet=true|false# 仅输出ID信息,默认为否
# docker images -q
5182e96772bf
c82521676580

  1.1.2 tag命令添加镜像标签

# docker tag centos:latest ylcentos:latest
# docker images
REPOSITORY          TAG               IMAGE ID            CREATED             SIZE
docker.io/centos    latest            5182e96772bf      7 days ago          200 MB
ylcentos            latest            5182e96772bf      7 days ago          200 MB

  centos:latest 镜像的ID和 ylcentos:latest 完全一致,它们实际指向同一个镜像文件,只是别名不同,docker tag命令添加的标签实际上起到了类似链接的作用;
  1.1.3 docker inspect 查看镜像详细信息
包括:制作者、适应架构、各层的数字摘要等

# docker inspect ylcentos:latest
[
{
"Id": "sha256:5182e96772bf11f4b912658e265dfe0db8bd314475443b6434ea708784192892",
"RepoTags": [
"docker.io/centos:latest",
"ylcentos:latest"
],
"RepoDigests": [
"docker.io/centos@sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf"
],
"Parent": "",
"Comment": "",
"Created": "2018-08-06T19:21:48.235227329Z",
"Container": "d60ffc9ddd12462af4bdcdbe45b74f3b3f99b46607ada80c3ed877b7def84250",
"ContainerConfig": {
"Hostname": "d60ffc9ddd12",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"/bin/bash\"]"
],
"ArgsEscaped": true,
"Image": "sha256:748eacc0f236df2fc9ba87c4d76a66cb10742120387e99e2acdb9454915c841d",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20180804",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"DockerVersion": "17.06.2-ce",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"ArgsEscaped": true,
"Image": "sha256:748eacc0f236df2fc9ba87c4d76a66cb10742120387e99e2acdb9454915c841d",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20180804",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 199723824,
"VirtualSize": 199723824,
"GraphDriver": {
"Name": "overlay2",
"Data": {
"MergedDir": "/var/lib/docker/overlay2/b06aedc45e998ab1b8761a2ddd98a6b75fc73f293dba4693ca8bcb0ee1aa5d6b/merged",
"UpperDir": "/var/lib/docker/overlay2/b06aedc45e998ab1b8761a2ddd98a6b75fc73f293dba4693ca8bcb0ee1aa5d6b/diff",
"WorkDir": "/var/lib/docker/overlay2/b06aedc45e998ab1b8761a2ddd98a6b75fc73f293dba4693ca8bcb0ee1aa5d6b/work"
}
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:1d31b5806ba40b5f67bde96f18a181668348934a44c9253b420d5f04cfb4e37a"
]
}
}
]

  返回的是JSON格式的内容,如果只需要其中一项可以用-f 参数来指定

# docker inspect -f "{{ .Architecture }}" ylcentos
amd64

  1.1.4 history 查看镜像历史
查看nginx:latest 镜像的创建过程

# docker history nginx:latest
IMAGE               CREATED             CREATED BY                                    SIZE                COMMENT
c82521676580      2 weeks ago         /bin/sh -c #(nop)CMD ["nginx" "-g" "daem...   0 B               
         2 weeks ago         /bin/sh -c #(nop)STOPSIGNAL          0 B               
         2 weeks ago         /bin/sh -c #(nop)EXPOSE 80/tcp                0 B               
         2 weeks ago         /bin/sh -c ln -sf /dev/stdout /var/log/ngi...   22 B               
         2 weeks ago         /bin/sh -c set -x&& apt-get update&& a...   53.7 MB            
         2 weeks ago         /bin/sh -c #(nop)ENV NJS_VERSION=1.15.2....   0 B               
         2 weeks ago         /bin/sh -c #(nop)ENV NGINX_VERSION=1.15....   0 B               
         3 weeks ago         /bin/sh -c #(nop)LABEL maintainer=NGINX ...   0 B               
         4 weeks ago         /bin/sh -c #(nop)CMD ["bash"]               0 B               
         4 weeks ago         /bin/sh -c #(nop) ADD file:919939fa0224727...   55.3 MB            

  1.1.5 docker search 搜索镜像
可以搜索远端仓库中共享的镜像,默认搜素官方仓库中的镜像;
  —automated=true|false# 仅显示自动创建的镜像,默认为否
—no-trunc=true|false      # 输出信息不截断显示,默认为否
-s#指定仅显示为指定星级以上的镜像,默认为0,即输出所有镜像

# docker search --automated -s 3 nginx
Flag --automated has been deprecated, use --filter=automated=true instead
Flag --stars has been deprecated, use --filter=stars=3 instead
INDEX       NAME                                                             DESCRIPTION                                     STARS   OFFICIAL   AUTOMATED
docker.io   docker.io/jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker c...   1381               
docker.io   docker.io/richarvey/nginx-php-fpm                              Container running Nginx + PHP-FPM capable ...   609                  
docker.io   docker.io/jrcs/letsencrypt-nginx-proxy-companion               LetsEncrypt container to use with nginx as...   394                  
docker.io   docker.io/webdevops/php-nginx                                    Nginx with PHP-FPM                              109                  
docker.io   docker.io/zabbix/zabbix-web-nginx-mysql                        Zabbix frontend based on Nginx web-server ...   61                  
docker.io   docker.io/bitnami/nginx                                          Bitnami nginx Docker Image                      57                  
docker.io   docker.io/1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          43                  
docker.io   docker.io/tobi312/rpi-nginx                                    NGINX on Raspberry Pi / armhf                   20                  
docker.io   docker.io/blacklabelops/nginx                                    Dockerized Nginx Reverse Proxy Server.          12                  
docker.io   docker.io/wodby/drupal-nginx                                     Nginx for Drupal container image                10                  
docker.io   docker.io/nginxdemos/hello                                       NGINX webserver that serves a simple page ...   8                  
docker.io   docker.io/webdevops/nginx                                        Nginx container                                 8                  
docker.io   docker.io/1science/nginx                                       Nginx Docker images that include Consul Te...   4                  

  1.1.6 docker rmi 删除镜像
  1.1.6.1 使用标签删除镜像
命令格式:docker rmi IMAGE   # 其中image可以为标签或者ID

# docker rmi ylcentos:latest
Untagged: ylcentos:latest
Untagged: docker.io/centos@sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf
  本地的centos:latest 镜像是否会受此命令的影响?当同一镜像有多个标签的时候,docker rmi命令指示删除该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上面的操作相当于知识删除了镜像5182e96772bf的一个标签而已;
  但是当镜像只剩下一个标签的时候要注意,此时再使用docker rmi命令会彻底删除镜像
  1.1.6.2 使用镜像ID删除镜像
  当使用docker rmi命令,并且后面跟上镜像的ID(也可以是能进行区分的部分ID串前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
  如果想要强行删除镜像,可以使用-f参数

# docker rmi -f ylcentos:latest
Untagged: ylcentos:latest
  注意:通常并不推荐使用-f参数来强行删除一个存在容器依赖的镜像;正确的做法是,先先删除依赖该镜像的所有容器,再来删除镜像;
  1.2 创建镜像
  创建镜像的方法有三种:
1、基于已有镜像的容器创建
2、基于本地模版导入
3、基于Dockerfile创建
  1.2.1 基于已有镜像的容器创建
使用命令 docker commit
命令格式: docker commit CONTAINER ]

-a , —author=“”    # 作者信息
-c , —change=[] : 提交的时候执行Dockerfile指令
-m , —message=“” : 提交信息
-p , —pause=true : 提交时暂停容器运行
# docker run -it centos:latest /bin/bash
# touch test
  记住容器的ID为:8eebcce9722a
此时该容器跟原centos:latest 镜像相比,已经发生了改变,可以使用 docker commit 命令来提交为一个新的镜像,提交时可以使用ID或名称来指定容器;

# docker commit -m "Added a new file" -a "Docker Newbee" 8eebcce9722a test:0.1
sha256:7c0264a9876f6eb69d90b93ed3dcc2a651ddffc59b11cf3bf3729ef9e3b9ece5
  docker commit提交完新的镜像后,会返回新创建的镜像ID信息,例如:7c0264a9876f6eb69d90b93ed3dcc2a651ddffc59b11cf3bf3729ef9e3b9ece5
  此时新创建的镜像 test:0.1已经存在于本地镜像列表当中:

# docker images
REPOSITORY          TAG               IMAGE ID            CREATED             SIZE
test                0.1               7c0264a9876f      8 minutes ago       200 MB
docker.io/centos    latest            5182e96772bf      7 days ago          200 MB
docker.io/nginx   latest            c82521676580      2 weeks ago         109 MB
  1.2.2 基于本地模版导入
  用户也可以直接从一个操作系统模板文件导入一个镜像,主要是用docker import命令;
命令格式: docker import file|URL|-]
  1.3 存出和载入镜像
  使用 docker save和docker load 命令来存出和载入镜像
  1.3.1 存出镜像

# docker images
REPOSITORY          TAG               IMAGE ID            CREATED             SIZE
test                0.1               7c0264a9876f      8 minutes ago       200 MB
docker.io/centos    latest            5182e96772bf      7 days ago          200 MB
docker.io/nginx   latest            c82521676580      2 weeks ago         109 MB
You have new mail in /var/spool/mail/root
# docker save -o test_0.1.tar test:0.1
# ll
total 406848
-rw------- 1 root root 208305664 Aug 14 15:46 test_0.1.tar

  用户可以通过复制 test_0.1.tar 文件将该镜像分享给他人;
  1.3.2 载入镜像

# docker load --input test_0.1.tar
1cee2207e92e: Loading layer [==================================================>] 2.048 kB/2.048 kB
Loaded image: test:0.1
或者:
# docker load < test_0.1.tar
1cee2207e92e: Loading layer [==================================================>] 2.048 kB/2.048 kB
Loaded image: test:0.1
# docker images
REPOSITORY          TAG               IMAGE ID            CREATED             SIZE
test                0.1               7c0264a9876f      32 minutes ago      200 MB
docker.io/centos    latest            5182e96772bf      7 days ago          200 MB
docker.io/nginx   latest            c82521676580      2 weeks ago         109 MB

  1.4 上传镜像
  可以使用docker push 命令上传镜像到仓库,默认上传到DockerHub官方仓库(需要登录)
  命令格式:
docker push NAME[:TAG] | /] NAME[:TAG]
  二、操作docker容器
  容器是Docker的另一个核心概念,简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。如果认为虚拟机时模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。
  2.1 创建容器
  2.1.1 docker create 新建一个镜像

# docker create -it centos:latest
d166acc28fb35b0998a8fd275219c36019270ebba005d819424dff01c9cfa912
# docker ps -a
CONTAINER ID      IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
d166acc28fb3      centos:latest       "/bin/bash"            16 seconds ago      Created                                       angry_dubinsky

  使用docker create 创建的容器处于停止状态,可以使用docker start 命令来启动;
  2.1.2 docker start 启动一个容器

# docker start d166acc28fb3
d166acc28fb3
使用docker ps查看运行的容器
# docker ps
CONTAINER ID      IMAGE               COMMAND             CREATED             STATUS            PORTS               NAMES
d166acc28fb3      centos:latest       "/bin/bash"         9 minutes ago       Up 11 seconds                           angry_dubinsky

  2.1.3 docker run 新建镜像并启动容器
  docker run等价于先执行docker create命令,再执行docker start命令
  例如:

# docker run centos /bin/echo'Hello World!'
Hello World!
  这和在本地直接执行/bin/echo ‘Hello World!’几乎感觉不出任何区别。
当利用docker run 创建并启动容器时,docker在后台运行的标准操作包括:


[*]检查本地是否存在指定的镜像,不存在就从公有仓库下载;
[*]利用镜像创建一个容器,并启动该容器;
[*]分配一个文件系统容器,并在只读的镜像层外面挂载一层可读写层;
[*]从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
[*]从网桥的地址池配置一个IP地址给容器;
[*]执行用户指定的应用程序;
[*]执行完毕后容器被自动终止;
  下面启动一个bash终端,允许用户进行交互

# docker run -it centos:latest /bin/bash
#
# pwd
/
#
# ls
anaconda-post.logbindevetchomeliblib64mediamntoptprocrootrunsbinsrvsystmpusrvar
# ps
PID TTY          TIME CMD
1 ?      00:00:00 bash
16 ?      00:00:00 ps
  在容器内用ps命令查看进程,可以看到,只运行了bash应用,并没有运行其他无关进程;
  用户可以按 Ctrl + d或者exit命令来退出容器
  有时候,执行docker run会出错,因为命令无法正常执行容器会直接退出,此时可以查看退出的错误代码:
  默认情况下,常见错误代码包括:

*   125 : docker daemon 执行出错,例如指定了不支持的Docker命令参数;
*   126 : 所指定命令无法执行,例如权限出错;
*   127 : 容器内命令无法找到;
  命令执行后出错,会默认返回错误码。
  2.1.4、守护态运行
  更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加 -d 参数来实现。
  例如:

# docker run -d centos /bin/sh -c "while true;do echo hello world;sleep 1;done"
972fa26b30d3704d42659bf07163101c6df1f8284094694672a5e77208908a1d
  容器启动后会返回一个唯一的id,也可以通过docker ps命令来查看容器信息;

# docker ps
CONTAINER ID      IMAGE               COMMAND                  CREATED             STATUS            PORTS               NAMES
972fa26b30d3      centos            "/bin/sh -c 'while..."   5 seconds ago       Up 5 seconds                            relaxed_spence

  如果要获取容器的输出信息,可以如下使用docker logs命令:

# docker logs 972fa26b30d3
hello world
hello world
hello world
  2.2 终止容器
  可以使用docker stop来终止一个运行中的容器。
命令格式:docker stop [-t | —time[=10]]
  首先向容器发送SIGTERM信号,等待一段超时时间(默认为10S)后,在发送SIGKILL信号来终止容器:

# docker stop 972fa26b30d3
972fa26b30d3
  docker ps -qa命令看到所有容器ID,例如:

# docker ps -qa
972fa26b30d3
367ec9a9e5b3
e9cd796bf46b
2711b952d41a
d166acc28fb3
  docker restart命令会将一个运行态的容器先终止,然后再重新启动它:

docker restart

# docker restart 972fa26b30d3
972fa26b30d3
  2.3 进入容器
  2.3.1 attach 命令

attach是Docker自带的命令,命令格式为:
docker attach [—detach-key[=[]]] [—no-stdin] [—sig-proxy[=true]] CONTAINER
# docker run -itd centos
519fe978cd650b265d76b5703c7e322cfabcbb35863a4e73294baff1e6590f31
# docker ps
CONTAINER ID      IMAGE               COMMAND                  CREATED             STATUS            PORTS               NAMES
519fe978cd65      centos            "/bin/bash"            6 seconds ago       Up 5 seconds                            elegant_bassi
# docker attach elegant_bassi
#
  但是使用attach命令有时候并不方便,当多个窗口同时用attach命令连到同一个容器的时候,所有窗口都会同步显示,当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
  2.3.2 exec 命令
  命令格式:

docker exec [-d | —detach] [—detach-key[=[]]] [-I | —interactive] [—privileged][-t | —tty] [-u | —user[=USER]] CONTAINER COMMAND
# docker exec -it 519fe978cd65 /bin/bash
#
  可以看到,一个bash终端打开了,在不影响容器内其他应用的前提下,用户可以很容易与容器进行交互。
  注意:通过指定 -it 参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式;
  2.3.3 nsenter 工具
  提示:生产场景是不使用docker attach的,需要我们使用nsenter这个工具,这个工具包含在util-linux软件包里面;
# yum install util-linux -y
Centos7默认最小化已经安装
  为了使用nsenter连接到容器,还需要找到容器进程的PID,可以通过下面的命令获取:

PID=$(docker inspect —format “{{ .State.Pid }}”)
# docker inspect -f "{{ .State.Pid }}" 519fe978cd65
29435
# docker inspect -f "{{ .State.Pid }}" elegant_bassi
29435
  通过这个PID,就可以连接到这个容器:

# nsenter --target 29435 -m -u -i -n -p
#
例子:
# docker run -itd centos
48aa2e39595a3f1ed63b872eeb0efd5f651ed39fe8d506779dd3287cdf120402
# docker ps
CONTAINER ID      IMAGE               COMMAND             CREATED             STATUS            PORTS               NAMES
48aa2e39595a      centos            "/bin/bash"         7 seconds ago       Up 6 seconds                            hardcore_davinci
# docker inspect -f "{{ .State.Pid }}" 48aa2e39595a
29624
# nsenter --target 29624 -m -u -i -n -p
#

  2.4 删除容器

可以使用 docker rm 命令来删除处于终止或退出状态的容器;
命令格式:docker rm [-f | —force] [-l | —link] [-v | —volumes] CONTAINER
  主要支持的选项包括:
-f , —force=false : 是否强行终止并删除一个运行中的容器;
-l , —link=false : 删除容器的连接,但保留容器;
-v, —volumes=false : 删除容器挂载的数据卷;
  例如,查看处于终止状态的容器,并删除:

# docker ps -a
CONTAINER ID      IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
972fa26b30d3      centos            "/bin/sh -c 'while..."   4 hours ago         Exited (137) 3 hours ago                        relaxed_spence
# docker rm 972fa26b30d3
972fa26b30d3
  默认情况下,docker rm命令智能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器。
  如果要直接删除一个运行中的容器,可以添加-f 参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除;
  例子:

# docker ps -a
CONTAINER ID      IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
48aa2e39595a      centos            "/bin/bash"            3 hours ago         Up 3 hours                                    hardcore_davinci
# docker rm 519fe978cd65
Error response from daemon: You cannot remove a running container 519fe978cd650b265d76b5703c7e322cfabcbb35863a4e73294baff1e6590f31. Stop the container before attempting removal or use -f
# docker rm -f 48aa2e39595a
48aa2e39595a

  2.5 导入和导出容器

有些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用Docker的导入和导出功能,这也是Docker自身提供的一个重要特性;
  2.5.1 导出容器
导出容器是指导初一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令;
  命令格式:
docker export [-o | —output[=“”]] CONTAINER
其中,可以通过-o 选项来指定导出的tar文件名,也可以直接通过重定向来实现。

# docker export -o centos_7.1.tar 519fe978cd65
或者
# docker export 519fe978cd65 > centos_7.2.tar
# ll
total 813680
-rw------- 1 root root 208294400 Aug 15 15:45 centos_7.1.tar
-rw-r--r-- 1 root root 208294400 Aug 15 15:46 centos_7.2.tar

  之后,可将导出的tar文件传输到其他机器上,然后再通过导入命令导入到系统中,从而实现容器的迁移;
  2.5.2 导入容器
  导出的文件又可以使用 docker import命令导入变成镜像

# docker import centos_7.1.tar test/centos:v1.0
sha256:6433c6458e515b27e4e98387685f6d791c34ff5c4b55184b13e075a51b08d5ac
# docker images
REPOSITORY          TAG               IMAGE ID            CREATED             SIZE
test/centos         v1.0                6433c6458e51      31 seconds ago      200 MB
  docker load命令来导入一个镜像文件,与docker export命令十分相似;

实际上,既可以使用docker load命令来导入镜像存储文件到本地镜像库,也可以使用docker import命令来导入一个容器快照到本地镜像库。
这两者的区别在与容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。


页: [1]
查看完整版本: Docker容器学习整理