Docker笔记
一、Docker架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
二、安装 Docker Engine-Community
1. CentOs Docker安装
- 1.1. 卸载旧版本
- 1.2. 安装yum-config-manager
yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
-
1.3. 设置Docker仓库(推荐使用国内的源地址)
- 设置官方仓库(比较慢)
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - 设置阿里云仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 设置官方仓库(比较慢)
-
1.4. 查看仓库中可用的Docker版本
- 列出并排序仓库中可用的版本。此示例按版本号(从高到低)对结果进行排序
$ yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
- 1.5. 安装指定版本
通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
- 1.6. 如果无须指定版本,即可通过以下命令直接安装最新版本
$ sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 1.7. 启动Docker
systemctl start docker
- 1.8. 验证安装情况
通过运行 hello-world 镜像来验证是否正确安装了 Docker Engine-Community 。
$ sudo docker run hello-world
2. 卸载Docker
- 2.1 删除安装包:
yum remove docker-ce
- 2.2 删除镜像、容器、配置文件等内容
rm -rf /var/lib/docker
三、基础命令(镜像)
1. 拉取或者更新镜像
-
docker pull : 从镜像仓库中拉取或者更新指定镜像
1) 语法docker pull [OPTIONS] NAME[:TAG|@DIGEST]
OPTIONS说明:
-a :拉取所有 tagged 镜像
–disable-content-trust :忽略镜像的校验,默认开启2) 命令实例
1. 从Docker Hub下载java最新版镜像。(默认拉取最新) docker pull java 2. 从Docker Hub下载REPOSITORY为java的所有镜像。 docker pull -a java
2. 列出本地镜像
-
docker images : 列出本地镜像。
1) 语法docker images [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS说明:
-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
–digests :显示镜像的摘要信息;
-f :显示满足条件的镜像;
–format :指定返回值的模板文件;
–no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。2) 命令实例
1. 查看本地镜像列表 runoob@runoob:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mymysql v1 37af1236adef 5 minutes ago 329 MB runoob/ubuntu v4 1c06aa18edee 2 days ago 142.1 MB <none> <none> 5c6e1090e771 2 days ago 165.9 MB httpd latest ed38aaffef30 11 days ago 195.1 MB alpine latest 4e38e38c8ce0 2 weeks ago 4.799 MB 2. 列出本地镜像中REPOSITORY为ubuntu的镜像列表 root@runoob:~# docker images ubuntu REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 14.04 90d5884b1ee0 9 weeks ago 188 MB ubuntu 15.10 4e3b13c8a266 3 months ago 136.3 MB
3. 删除本地镜像
-
docker rmi : 删除本地一个或多个镜像。
1) 语法docker rmi [OPTIONS] IMAGE [IMAGE…]
OPTIONS说明:
-f :强制删除;
–no-prune :不移除该镜像的过程镜像,默认移除;2) 命令实例
1. 强制删除本地镜像 runoob/ubuntu:v4 root@runoob:~# docker rmi -f runoob/ubuntu:v4 Untagged: runoob/ubuntu:v4 Deleted: sha256:1c06aa18edee44230f93a90a7d88139235de12cd4c089d41eed8419b503072be Deleted: sha256:85feb446e89a28d58ee7d80ea5ce367eebb7cec70f0ec18aa4faa874cbd97c73
4. 查看镜像创建历史
-
docker history : 查看指定镜像的创建历史。
1) 语法docker history [OPTIONS] IMAGE
OPTIONS说明:
-H :以可读的格式打印镜像大小和日期,默认为true;
–no-trunc :显示完整的提交记录;
-q :仅列出提交记录ID。2) 命令实例
1. 查看本地镜像runoob/ubuntu:v3的创建历史。 root@runoob:~# docker history runoob/ubuntu:v3 IMAGE CREATED CREATED BY SIZE COMMENT 4e3b13c8a266 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B <missing> 3 months ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.863 kB <missing> 3 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /u 701 B <missing> 3 months ago /bin/sh -c #(nop) ADD file:43cb048516c6b80f22 136.3 MB
四. 基础命令(容器)
1. 创建新容器
-
1) docker run :创建一个新的容器并运行一个命令
1.1) 语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。1.2) 命令实例
1. 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。 docker run --name mynginx -d nginx:latest 2.使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。 docker run -P -d nginx:latest 3.使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。 docker run -p 80:80 -v /data:/data -d nginx:latest 4.绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。 $ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash 5.使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。 runoob@runoob:~$ docker run -it nginx:latest /bin/bash root@b8573233d675:/#
-
2) docker create:创建一个新的容器但不启动它
2.1) 语法
docker create [OPTIONS] IMAGE [COMMAND] [ARG…]
2.2) 命令实例
1. 使用docker镜像nginx:latest创建一个容器,并将容器命名为myrunoob runoob@runoob:~$ docker create --name myrunoob nginx:latest
2. 操作已有容器(start/stop/restart/kill)
-
docker start :启动一个或多个已经被停止的容器
-
docker stop :停止一个运行中的容器
-
docker restart :重启容器
-
docker kill :杀掉一个运行中的容器
1) 语法:docker start [OPTIONS] CONTAINER [CONTAINER…]
docker stop [OPTIONS] CONTAINER [CONTAINER…]
docker restart [OPTIONS] CONTAINER [CONTAINER…]
docker kill [OPTIONS] CONTAINER [CONTAINER…]
OPTIONS说明:-s :向容器发送一个信号2) 命令实例
1.启动已被停止的容器myrunoob docker start myrunoob 2.停止运行中的容器myrunoob docker stop myrunoob 3.重启容器myrunoob docker restart myrunoob 4.杀掉运行中的容器mynginx runoob@runoob:~$ docker kill -s KILL mynginx
3. 查看容器
-
docker ps: 列出容器
1) 语法
docker ps [OPTIONS]
OPTIONS说明:
-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
–format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
–no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。2) 命令实例
1.列出所有在运行的容器信息。 runoob@runoob:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES 09b93464c2f7 nginx:latest "nginx -g 'daemon off" ... 80/tcp, 443/tcp myrunoob 96f7f14e99ab mysql:5.6 "docker-entrypoint.sh" ... 0.0.0.0:3306->3306/tcp mymysql 2. 列出最近创建的5个容器信息。 runoob@runoob:~$ docker ps -n 5 CONTAINER ID IMAGE COMMAND CREATED 09b93464c2f7 nginx:latest "nginx -g 'daemon off" 2 days ago ... b8573233d675 nginx:latest "/bin/bash" 2 days ago ... b1a0703e41e7 nginx:latest "nginx -g 'daemon off" 2 days ago ... f46fb1dec520 5c6e1090e771 "/bin/sh -c 'set -x \t" 2 days ago ... a63b4a5597de 860c279d2fec "bash" 2 days ago ... 3. 列出所有创建的容器ID(包括未运行的)。 runoob@runoob:~$ docker ps -a -q 09b93464c2f7 b8573233d675 b1a0703e41e7 f46fb1dec520 a63b4a5597de 6a4aa42e947b de7bb36e7968
4. 删除容器
-
docker rm :删除一个或多个容器。
1) 语法
docker rm [OPTIONS] CONTAINER [CONTAINER…]
OPTIONS说明:
-f :通过 SIGKILL 信号强制删除一个运行中的容器。
-l :移除容器间的网络连接,而非容器本身。
-v :删除与容器关联的卷。2) 命令实例
1.强制删除容器 db01、db02: docker rm -f db01 db02 2.移除容器 nginx01 对容器 db01 的连接,连接名 db: docker rm -l db 3.删除容器 nginx01, 并删除容器挂载的数据卷: docker rm -v nginx01 4.删除所有已经停止的容器: docker rm $(docker ps -a -q)
5. 进入容器
-
docker exec :在运行的容器中执行命令
1) 语法
docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
OPTIONS说明:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端2) 命令实例
1.在容器 mynginx 中以交互模式执行容器内 /root/runoob.sh 脚本: runoob@runoob:~$ docker exec -it mynginx /bin/sh /root/runoob.sh http://www.runoob.com/ 2.在容器 mynginx 中开启一个交互模式的终端: runoob@runoob:~$ docker exec -i -t mynginx /bin/bash root@b1a0703e41e7:/#
-
docker attach :连接到正在运行中的容器。
1) 语法docker attach [OPTIONS] CONTAINER
2) 命令实例
1.容器mynginx将访问日志指到标准输出,连接到容器查看访问信息。 runoob@runoob:~$ docker attach --sig-proxy=false mynginx 192.168.239.1 - - [10/Jul/2016:16:54:26 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-" #官方文档中说attach后可以通过CTRL-C来detach,但实际上经过我的测试,如果container当前在运行bash,CTRL-C自然是当前行的输入,没有退出;如果container当前正在前台运行进程,如输出nginx的access.log日志,CTRL-C不仅会导致退出容器,而且还stop了。这不是我们想要的,detach的意思按理应该是脱离容器终端,但容器依然运行。 #attach是可以带上--sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。
-
docker exec和docker attach的区别
docker exec 进入容器后,执行exit命令会退出容器终端,但不会导致容器的停止;docker attach进入容器后,执行exit命令不仅会退出容器终端,还会导致容器的停止;
6. 暂停/恢复容器中的进程
-
docker pause :暂停容器中所有的进程。
-
docker unpause :恢复容器中所有的进程。
1) 语法
docker pause CONTAINER [CONTAINER…]
docker unpause CONTAINER [CONTAINER…]2) 命令实例
1. 暂停数据库容器db01提供服务。 docker pause db01 2. 恢复数据库容器 db01 提供服务。 docker unpause db01
7. 查看容器中运行的进程信息
- docker top :查看容器中运行的进程信息,支持 ps 命令参数。
1) 语法
docker top [OPTIONS] CONTAINER [ps OPTIONS]
#容器运行时不一定有/bin/bash终端来交互执行top命令,而且容器还不一定有top命令,可以使用docker top来实现查看container中正在运行的进程。
2) 命令实例
1. 查看容器mymysql的进程信息
runoob@runoob:~/mysql$ docker top mymysql
UID PID PPID C STIME TTY TIME CMD
999 40347 40331 18 00:58 ? 00:00:02 mysqld
2. 查看所有运行容器的进程信息
for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
8. 获取容器的日志
- docker logs :获取容器的日志
1) 语法
docker logs [OPTIONS] CONTAINER
OPTIONS说明:
-f : 跟踪日志输出
–since :显示某个开始时间的所有日志
-t : 显示时间戳
–tail :仅列出最新N条容器日志
2) 命令实例
1. 跟踪查看容器mynginx的日志输出。
runoob@runoob:~$ docker logs -f mynginx
192.168.239.1 - - [10/Jul/2016:16:53:33 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-"
2016/07/10 16:53:33 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.239.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.239.130", referrer: "http://192.168.239.130/"
192.168.239.1 - - [10/Jul/2016:16:53:33 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://192.168.239.130/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-"
192.168.239.1 - - [10/Jul/2016:16:53:59 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-"