docker使用

134 阅读7分钟

Docker 架构

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

安装

卸载旧版本

$ sudo yum remove docker*

设置仓库

$ sudo yum install -y yum-utils

配置国内源

$ sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker

Docker 安装完默认未启动。并且已经创建好 docker 用户组,但该用户组下没有用户。

$ sudo yum install -y docker-ce docker-ce-cli containerd.io

启动

开机启动且立即启动

$ sudo systemctl enable docker --now
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker info
Client: Docker Engine - Community
 Version:    26.1.2
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.14.0
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.27.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 1
  Running: 0
  Paused: 0
  Stopped: 1
 Images: 1
 Server Version: 26.1.2
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: e377cd56a71523140ca6ae87e30244719194a521
 runc version: v1.1.12-0-g51d5e94
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 3.10.0-1160.114.2.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 1.794GiB
 Name: iZ2ze5r95mlp6nxsm5ak6lZ
 ID: 852d0fa7-5f8c-4484-b17a-b76ca6941565
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

镜像加速

阿里云镜像获取地址:cr.console.aliyun.com/cn-hangzhou…

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://44w8oqlc.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

命令

镜像操作

images

列出本地主机上的镜像

$ sudo docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    d2c94e258dcb   12 months ago   13.3kB
nginx         latest    605c77e624dd   2 years ago     141MB
redis         latest    7614ae9453d1   2 years ago     113MB

search

查找镜像

$ sudo docker search nginx

pull

拉取镜像(默认下载最新版,想指定版本,去tag查找)

$ sudo docker pull nginx

rmi

删除镜像(后面可以加镜像名称,也可以加IMAGE ID

$ docker rmi 7614ae9453d1
Untagged: redis:latest
Untagged: redis@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Deleted: sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631
Deleted: sha256:49c70179bc923a7d48583d58e2b6c21bde1787edf42ed1f8de9e9b96e2e88e65
Deleted: sha256:396e06df5d1120368a7a8a4fd1e5467cdc2dd4083660890df078c654596ddc1c
Deleted: sha256:434d118df2e9edb51238f6ba46e9efdfa21be68e88f54787531aa39a720a0740
Deleted: sha256:2047f09c412ff06f4e2ee8a25d105055e714d99000711e27a55072e640796294
Deleted: sha256:13d71c9ccb39b206211dd1900d06aa1984b0f5ab8abaa628c70b3eb733303a65

commit

提交改变

  • -a:作者
  • -m: 备注
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker commit -a "yhq" -m "修改yhq" yhqnginx-port yhq-nginx:v0.1
sha256:7e8d1ab3cf835af5634e0c74d8a5d5b08a9f3ffdad9b8d2616a61ff6bdea700e
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
yhq-nginx     v0.1      7e8d1ab3cf83   4 seconds ago   141MB
hello-world   latest    d2c94e258dcb   12 months ago   13.3kB
nginx         latest    605c77e624dd   2 years ago     141MB

save

将镜像生成一个本地文件

[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
yhq-nginx     v0.1      7e8d1ab3cf83   15 minutes ago   141MB
hello-world   latest    d2c94e258dcb   12 months ago    13.3kB
nginx         latest    605c77e624dd   2 years ago      141MB
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker save -o yhq-nginx.tar 7e8d1ab3cf83
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# ll
总用量 142504
-rw------- 1 root root 145924096 5月  14 00:03 yhq-nginx.tar

load

加载文件形式的镜像

[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker load -i yhq-nginx.tar

tag

创建一个标记

[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
yhq-nginx     v0.1      7e8d1ab3cf83   41 minutes ago   141MB
hello-world   latest    d2c94e258dcb   12 months ago    13.3kB
nginx         latest    605c77e624dd   2 years ago      141MB
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker tag 7e8d1ab3cf83 hongquanyang/yhq-nginx:v0.1
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
hongquanyang/yhq-nginx   v0.1      7e8d1ab3cf83   51 minutes ago   141MB
yhq-nginx                v0.1      7e8d1ab3cf83   51 minutes ago   141MB
hello-world              latest    d2c94e258dcb   12 months ago    13.3kB
nginx                    latest    605c77e624dd   2 years ago      141MB

push

将镜像推送到远程仓库(需要先登录,使用login命令,推送完使用logout退出)

[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker push hongquanyang/yhq-nginx:v0.1

容器操作

run

启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run 设置项 镜像名 镜像启动运行命令(镜像默认有)
  • --name:为容器指定名称

    [root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker run --name=yhqnginx nginx
    /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    /docker-entrypoint.sh: Configuration complete; ready for start up
    2024/05/13 14:56:38 [notice] 1#1: using the "epoll" event method
    2024/05/13 14:56:38 [notice] 1#1: nginx/1.21.5
    2024/05/13 14:56:38 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
    2024/05/13 14:56:38 [notice] 1#1: OS: Linux 3.10.0-1160.114.2.el7.x86_64
    2024/05/13 14:56:38 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
    2024/05/13 14:56:38 [notice] 1#1: start worker processes
    2024/05/13 14:56:38 [notice] 1#1: start worker process 31
    
  • -d:后台运行(守护进程)

    [root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker run --name=yhqnginx -d nginx
    536bca38644733f2fb07d40045409adee37857526abcdddb9daece11640b72c6
    [root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker ps -a
    CONTAINER ID   IMAGE         COMMAND                   CREATED         STATUS                   PORTS     NAMES
    536bca386447   nginx         "/docker-entrypoint.…"   2 seconds ago   Up 1 second              80/tcp    yhqnginx
    5eed93f03479   hello-world   "/hello"                  4 hours ago     Exited (0) 4 hours ago             cool_tharp
    
  • --restart:跟随系统开机自启

    [root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker run --name=yhqnginx-restart -d --restart=always nginx
    6b398f935d67a06a157c83f954353ed562a35fbcf595777e9a2b10a1d78704e7
    
    
  • -p:端口映射(开启安全组)

    [root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker run --name=yhqnginx-port -d --restart=always -p 88:80 nginx
    c098b9fde52d87ca4aefdd43885f164f23aea6b9510a8e8d50a21d0217d613f5
    [root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                               NAMES
    c098b9fde52d   nginx     "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:88->80/tcp, :::88->80/tcp   yhqnginx-port
    
  • -v:挂载目录(挂载主机目录到容器)

    将主机目录挂载到容器目录,:ro代表的只读,wo代表读写。

    [root@iZ2ze5r95mlp6nxsm5ak6lZ data]# docker run --name=mount-nginx -d --restart=always -p 88:80 -v /data/html:/usr/share/nginx/html:ro nginx
    cc33019daa6fdae78a0c04e7dc79124233130a767926d418a5398d262f7bde97
    

image.png

ps

查看正在运行的容器

[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS     NAMES
d990c87df313   nginx     "/docker-entrypoint.…"   42 seconds ago   Up 41 seconds   80/tcp    yhqnginx

查看所有容器(默认查看正在运行的容器)

[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND                   CREATED         STATUS                      PORTS     NAMES
d990c87df313   nginx         "/docker-entrypoint.…"   2 minutes ago   Exited (0) 12 seconds ago             yhqnginx
5eed93f03479   hello-world   "/hello"                  3 hours ago     Exited (0) 3 hours ago                cool_tharp

rm

删除容器

[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND                   CREATED         STATUS                      PORTS     NAMES
d990c87df313   nginx         "/docker-entrypoint.…"   2 minutes ago   Exited (0) 12 seconds ago             yhqnginx
5eed93f03479   hello-world   "/hello"                  3 hours ago     Exited (0) 3 hours ago                cool_tharp
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker rm yhqnginx
yhqnginx
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED       STATUS                   PORTS     NAMES
5eed93f03479   hello-world   "/hello"   4 hours ago   Exited (0) 4 hours ago             cool_tharp

删除正在运行的容器

$ docker rm -f yhqnginx

stop

停止容器

[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND                   CREATED              STATUS                   PORTS     NAMES
536bca386447   nginx         "/docker-entrypoint.…"   About a minute ago   Up About a minute        80/tcp    yhqnginx
5eed93f03479   hello-world   "/hello"                  4 hours ago          Exited (0) 4 hours ago             cool_tharp
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker stop 536bca386447
536bca386447
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND                   CREATED              STATUS                     PORTS     NAMES
536bca386447   nginx         "/docker-entrypoint.…"   About a minute ago   Exited (0) 2 seconds ago             yhqnginx
5eed93f03479   hello-world   "/hello"                  4 hours ago          Exited (0) 4 hours ago               cool_tharp

start

启动容器

[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND                   CREATED              STATUS                     PORTS     NAMES
536bca386447   nginx         "/docker-entrypoint.…"   About a minute ago   Exited (0) 2 seconds ago             yhqnginx
5eed93f03479   hello-world   "/hello"                  4 hours ago          Exited (0) 4 hours ago               cool_tharp
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker start 536bca386447
536bca386447
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND                   CREATED         STATUS                   PORTS     NAMES
536bca386447   nginx         "/docker-entrypoint.…"   3 minutes ago   Up 1 second              80/tcp    yhqnginx
5eed93f03479   hello-world   "/hello"                  4 hours ago     Exited (0) 4 hours ago             cool_tharp

update

更改容器项,不能修改端口映射

[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker update yhqnginx --restart=always
yhqnginx

exec

进入容器(-it:交互模式)

[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                               NAMES
c098b9fde52d   nginx     "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:88->80/tcp, :::88->80/tcp   yhqnginx-port
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# docker exec -it c098b9fde52d /bin/bash
root@c098b9fde52d:/# 

修改内容

这里以nginx静态页为例

root@c098b9fde52d:/# cd /usr/share/nginx/html
root@c098b9fde52d:/usr/share/nginx/html# ls
50x.html  index.html
root@c098b9fde52d:/usr/share/nginx/html# echo "<h1>yhq</h1>" > index.html 
root@c098b9fde52d:/usr/share/nginx/html# cat index.html 
<h1>yhq</h1>

image.png

exit:退出

root@c098b9fde52d:/usr/share/nginx/html# exit
exit
[root@iZ2ze5r95mlp6nxsm5ak6lZ ~]# 

logs

查看运行日志

[root@iZ2ze5r95mlp6nxsm5ak6lZ data]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                               NAMES
cc33019daa6f   nginx     "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes   0.0.0.0:88->80/tcp, :::88->80/tcp   mount-nginx
[root@iZ2ze5r95mlp6nxsm5ak6lZ data]# docker logs cc33019daa6f
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/05/14 01:31:18 [notice] 1#1: using the "epoll" event method
2024/05/14 01:31:18 [notice] 1#1: nginx/1.21.5
2024/05/14 01:31:18 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
2024/05/14 01:31:18 [notice] 1#1: OS: Linux 3.10.0-1160.114.2.el7.x86_64
2024/05/14 01:31:18 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/05/14 01:31:18 [notice] 1#1: start worker processes
2024/05/14 01:31:18 [notice] 1#1: start worker process 31
123.112.18.54 - - [14/May/2024:01:31:21 +0000] "GET / HTTP/1.1" 200 24 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "-"
123.112.18.54 - - [14/May/2024:01:31:22 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "-"
123.112.18.54 - - [14/May/2024:01:32:03 +0000] "GET / HTTP/1.1" 200 23 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "-"
2024/05/14 01:36:20 [error] 31#31: *3 open() "/usr/share/nginx/html/yhq" failed (2: No such file or directory), client: 123.112.18.54, server: localhost, request: "GET /yhq HTTP/1.1", host: "8.146.211.61:88"
123.112.18.54 - - [14/May/2024:01:36:20 +0000] "GET /yhq HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "-"
2024/05/14 01:36:36 [error] 31#31: *5 open() "/usr/share/nginx/html/yhq" failed (2: No such file or directory), client: 123.6.49.10, server: localhost, request: "GET /yhq HTTP/1.1", host: "8.146.211.61:88"
123.6.49.10 - - [14/May/2024:01:36:36 +0000] "GET /yhq HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36" "-"
2024/05/14 01:36:36 [error] 31#31: *5 open() "/usr/share/nginx/html/yhq" failed (2: No such file or directory), client: 123.6.49.10, server: localhost, request: "GET /yhq HTTP/1.1", host: "8.146.211.61:88", referrer: "http://baidu.com/"
123.6.49.10 - - [14/May/2024:01:36:36 +0000] "GET /yhq HTTP/1.1" 404 555 "http://baidu.com/" "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36" "-"

cp

将容器中的文件复制到主机,也可以将主机文件复制到容器

[root@iZ2ze5r95mlp6nxsm5ak6lZ data]# docker cp cc33019daa6f:/etc/nginx/nginx.conf /data/conf
Successfully copied 2.56kB to /data/conf
[root@iZ2ze5r95mlp6nxsm5ak6lZ data]# docker cp /data/conf cc33019daa6f:/etc/nginx/nginx.conf
Successfully copied 2.56kB to /data/conf

Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

  1. 每条保留字指令都必须大写且后面要跟一个参数

  2. 指令按照从上至下,顺序执行

  3. #表示注释

  4. 每条指令都会创建一个新的镜像层并对镜像进行提交

保留字

FROM

基础镜像,当前镜像是基于哪个镜像的,指定一个已存在的镜像作为模板。

MAINTAINER

镜像维护者的姓名和邮箱

RUN

容器构建时需要运行的命令,RUN是在docker build 时运行。

EXPOSE

容器对外的端口

WORKDIR

指定在创建容器后,终端默认进入的工作目录。

USER

指定镜像运行的用户,默认root

ENV

用来在构建镜像过程中设置环境变量

VOLUME

容器数据卷,用于数据保存和持久化工作

ADD

将主机下的文件拷贝进镜像且会自动处理URL和解压tar包。

COPY

将主机下的文件拷贝进镜像

CMD

指定容器启动后要做的事情

Dockerfile可以有多个CMD命令,但只有最后一个生效CMD会被docker run之后的参数替换。

ENTRYPOINT

也是用来指定容器时要运行的命令,类似于CMD,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且会被当做参数传给ENTPYPOINT