Docker容器基本操作

1. Docker安装部署

1.1 openEuler使用YUM安装

[root@node1 ~]# yum install docker -y
[root@node1 ~]# docker version
Client:
 Version:           18.09.0
 EulerVersion:      18.09.0.332
 API version:       1.39
 Go version:        go1.17.3
 Git commit:        9942888
 Built:             Wed Dec 27 10:05:53 2023
 OS/Arch:           linux/amd64
 Experimental:      false
​
Server:
 Engine:
  Version:          18.09.0
  EulerVersion:     18.09.0.332
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.17.3
  Git commit:       9942888
  Built:            Wed Dec 27 10:05:15 2023
  OS/Arch:          linux/amd64
  Experimental:     false

1.2 通用二进制方式安装(适合所有版本)

二进制包下载地址: Index of linux/static/stable/x86_64/

[root@node2 ~]# wget -c  https://download.docker.com/linux/static/stable/x86_64/docker-25.0.3.tgz
[root@node2 ~]# tar xzf docker-25.0.3.tgz -C /usr/local/  #解压
[root@node2 ~]# vim /usr/lib/systemd/system/docker.service  #配置服务脚本
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
​
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
​
ExecStart=/usr/bin/dockerd $OPTIONS \
                           $DOCKER_STORAGE_OPTIONS \
                           $DOCKER_NETWORK_OPTIONS \
                           $INSECURE_REGISTRY
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
​
[Install]
WantedBy=multi-user.target
​
[root@node2 ~]# cp /usr/local/docker/* /usr/bin/ 
[root@node2 ~]# systemctl start docker.service
[root@node2 ~]# docker version
Client:
 Version:           25.0.3
 API version:       1.44
 Go version:        go1.21.6
 Git commit:        4debf41
 Built:             Fri Feb 23 02:37:27 2024
 OS/Arch:           linux/amd64
 Context:           default
​
Server: Docker Engine - Community
 Engine:
  Version:          25.0.3
  API version:      1.44 (minimum version 1.24)
  Go version:       go1.21.6
  Git commit:       f417435
  Built:            Fri Feb 23 02:38:33 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.7.13
  GitCommit:        7c3aca7a610df76212171d200ca3811ff6096eb8
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

注意:该方式没有命令补全

1.3 YUM仓库方式安装(本人推荐)

[root@node2 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 #安装依赖
[root@node2 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
[root@node2 ~]# sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo   #替换仓库源
[root@node2 ~]# sed -i 's/$releasever/8Server/g' /etc/yum.repos.d/docker-ce.repo  
#CentOS7只要把8Server换成7Server
[root@node2 ~]# yum install docker-ce -y
[root@node2 ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.21
 API version:       1.41
 Go version:        go1.18.7
 Git commit:        baeda1f
 Built:             Tue Oct 25 18:02:19 2022
 OS/Arch:           linux/amd64
 Context:           default

1.4 镜像加速器配置

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

注意:每个人的镜像加速不一样,当然用我的也可以,最好用自己的,在自己阿里云的镜像服务里找

2. Docker镜像操作

2.1 搜索镜像

[root@node2 ~]# docker search --help
docker search [OPTIONS] TERM
TERM:想要搜索的镜像名称或关键字。
选项:
    -f, --filter    根据提供的条件过滤搜索结果
    --format string 选项允许你使用Go模板格式化搜索结果。
    --limit int     用于限制搜索结果的最大数量。默认值为25
    --no-trunc      用于不截断输出。默认情况下,搜索结果的描述可能会被截断以节省空间
​
示例:
1.查看包括busybox并且至少有50星的镜像
[root@node2 ~]# docker search -f stars=50 busybox
NAME                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
busybox              Busybox base image.                             3221      [OK]       
radial/busyboxplus   Full-chain, Internet enabled, busybox made f…   56                   [OK]
​
2. 只显示镜像名称和描述
root@node2 ~]# docker search -f stars=50 --format "table {{.Name}}\t{{.Description}}" busybox
NAME                 DESCRIPTION
busybox              Busybox base image.
radial/busyboxplus   Full-chain, Internet enabled, busybox made f…
​
3.要限制结果为3个
[root@node2 ~]# docker search --limit 3 busybox
NAME                     DESCRIPTION           STARS     OFFICIAL   AUTOMATED
busybox                  Busybox base image.   3221      [OK]       
openebs/busybox-client                         1                    
rancher/busybox                                0 

2.2 拉取镜像

[root@node2 ~]# docker pull --help
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
选项:
    -a, --all-tags          下载仓库中的所有标记的镜像
    --disable-content-trust 跳过镜像验证
    --platform string       指定服务器的平台类型
    -q, --quiet             静默输出
    
示例:
1.下载Ubuntu仓库中的所有镜像
[root@node2 ~]# docker pull --all-tags ubuntu
​
2.拉取镜像  
[root@node2 ~]# docker pull centos:7   #默认从DockerHub拉取
7: Pulling from library/centos
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Image is up to date for centos:7
docker.io/library/centos:7
​
注意:拉去镜像不指定版本默认为latest最新版

2.3 查看镜像

2.3.1 列出镜像

方式一:

[root@node2 ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       7         eeb6ee3f44bd   2 years ago   204MB

方式二:

[root@node2 ~]# docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       7         eeb6ee3f44bd   2 years ago   204MB

2.3.2 查看镜像历史信息

[root@node2 ~]# docker  history --help​
Usage:  docker history [OPTIONS] IMAGE
​
Show the history of an image
​
--format string: 使用Go模板格式化输出,可以自定义输出格式。
-H, --human: 以人类可读的格式打印大小和日期,这是默认行为。
--no-trunc: 不截断输出,显示完整的信息。
-q, --quiet: 仅显示镜像ID,这对于脚本处理或需要快速检索特定信息非常有用。
​
[root@node2 ~]# docker history centos:7
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
eeb6ee3f44bd   2 years ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      2 years ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      2 years ago   /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB     

2.3.2 查看镜像详细信息

[root@node2 ~]# docker inspect centos:7
[
    {
        "Id": "sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9",
        "RepoTags": [
            "centos:7"
        ],
        "RepoDigests": [
            "centos@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-09-15T18:20:23.99863383Z",
        "Container": "5e4c7bfd35862166e9efd7532208300600114f0acff8f82fd537a57bdd523fe2",
        "ContainerConfig": {
            "Hostname": "5e4c7bfd3586",
            "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\"]"
            ],
            "Image": "sha256:ba35a4b787c8f11e3b6ed9248c7663b4f27459e9715a1ace09f966259d5ebc3a",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20201113",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS",
                "org.opencontainers.image.created": "2020-11-13 00:00:00+00:00",
                "org.opencontainers.image.licenses": "GPL-2.0-only",
                "org.opencontainers.image.title": "CentOS Base Image",
                "org.opencontainers.image.vendor": "CentOS"
            }
        },
        "DockerVersion": "20.10.7",
        "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"
            ],
            "Image": "sha256:ba35a4b787c8f11e3b6ed9248c7663b4f27459e9715a1ace09f966259d5ebc3a",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20201113",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS",
                "org.opencontainers.image.created": "2020-11-13 00:00:00+00:00",
                "org.opencontainers.image.licenses": "GPL-2.0-only",
                "org.opencontainers.image.title": "CentOS Base Image",
                "org.opencontainers.image.vendor": "CentOS"
            }
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 203936249,
        "VirtualSize": 203936249,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/9547ddeeb7a2b10f09dcd3455af31216c19d3ee8ab994a476b2df48d9572e5c4/merged",                "UpperDir": "/var/lib/docker/overlay2/9547ddeeb7a2b10f09dcd3455af31216c19d3ee8ab994a476b2df48d9572e5c4/diff",
                "WorkDir": "/var/lib/docker/overlay2/9547ddeeb7a2b10f09dcd3455af31216c19d3ee8ab994a476b2df48d9572e5c4/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:174f5685490326fc0a1c0f5570b8663732189b327007e47ff13d2ca59673db02"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

2.4 导出镜像

方式一:

[root@node2 ~]# docker image save -o centos7.tar centos:7
[root@node2 ~]# ll
total 206736
-rw-------. 1 root root 211696640 Mar  2 21:04 centos7.tar

方式二:

[root@node2 ~]# docker image save > centos7.9.tar centos:7
[root@node2 ~]# ll
total 413472
-rw-r--r--. 1 root root 211696640 Mar  2 21:05 centos7.9.tar
-rw-------. 1 root root 211696640 Mar  2 21:05 centos7.tar

注意:这两种方式导出文件的权限不一样

2.5 导入镜像

[root@node2 ~]# scp centos7.9.tar 192.168.110.31:~/
​
[root@node1 ~]# docker load -i centos7.9.tar 
174f56854903: Loading layer [==================================================>]  211.7MB/211.7MB
Loaded image: centos:7
[root@node1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   eeb6ee3f44bd        2 years ago         204MB

2.6 删除镜像

方法一:

[root@node2 ~]# docker rmi centos:7
Untagged: centos:7
Untagged: centos@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Deleted: sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9
Deleted: sha256:174f5685490326fc0a1c0f5570b8663732189b327007e47ff13d2ca59673db02

方法二:

[root@node2 ~]# docker image rm nginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:c26ae7472d624ba1fafd296e73cecc4f93f853088e6a9c13c0d52f6ca5865107
Deleted: sha256:e4720093a3c1381245b53a5a51b417963b3c4472d3f47fc301930a4f3b17666a
Deleted: sha256:583de6ce675ade688fa76e7c18948b4907557a139e12825ae85e5a8c947e2c89
Deleted: sha256:1084f34dba33ee0238270b757d7d4c3ffa06fcac38f1be5bf26bf35d8982eb17
Deleted: sha256:eb8c0a03ddeb2a6164cddaa21c9795cf8e20dbe788ed6bcaa9cc2b5a58fa8aff
Deleted: sha256:3a4f946657e22d88014e3063827b07c83ac6d999d7f7b19618037bcee5c5f009
Deleted: sha256:0c2e669c3c8abe5ce516bd0ffbb3dec76614a9cd1dec058a7c4815a403adee83
Deleted: sha256:0814ebf6e0ed919bf8bf686038d645aa2b535eb9a6bc4b58b2df1b31d499fe3d
Deleted: sha256:ceb365432eec83dafc777cac5ee87737b093095035c89dd2eae01970c57b1d15

2.7 打标签

[root@node2 ~]# docker tag centos:7 mycentos7
[root@node2 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       7         eeb6ee3f44bd   2 years ago   204MB
mycentos7    latest    eeb6ee3f44bd   2 years ago   204MB
​
注意:两个标签的ID相同,删除一个另一个还可以用
[root@node2 ~]# docker rmi centos:7 
Untagged: centos:7
Untagged: centos@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
[root@node2 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mycentos7    latest    eeb6ee3f44bd   2 years ago   204MB
[root@node2 ~]# docker run -itd mycentos7  #也可以运行容器
fd2c7b890818326aac214e8374abb5d23b8809c306918d6fe1024c1303c261bb
[root@node2 ~]# docker ps
CONTAINER ID   IMAGE       COMMAND       CREATED         STATUS         PORTS     NAMES
fd2c7b890818   mycentos7   "/bin/bash"   6 seconds ago   Up 5 seconds             jolly_booth
#-itd是启动并放到后台运行,如果只有-d需要手动启动

3. Docker容器操作

3.1 创建容器

3.1.1 使用docker create创建容器

docker create命令用于创建一个新的容器,但并不启动它。这个命令提供了一系列选项来配置容器的环境和行为。

常用命令参数说明:

  • --add-host list: 添加自定义的主机到IP映射。

  • -a, --attach list: 附加到STDIN, STDOUT或STDERR。

  • --blkio-weight uint16: 设置块IO的相对权重,范围在10到1000之间,或设置为0以禁用。

  • --cap-add list: 添加Linux能力。

  • --cap-drop list: 删除Linux能力。

  • --cidfile string: 将容器ID写入文件。

  • --cpu-shares int: CPU份额(相对权重)。

  • --cpus decimal: 设置CPU核心数量。

  • --device list: 将主机设备添加到容器中。

  • --env list: 设置环境变量。

  • --expose list: 暴露端口或端口范围。

  • --hostname string: 容器主机名。

  • -i, --interactive: 保持STDIN开启,即使没有附加。

  • -m, --memory bytes: 设置内存限制。

  • --name string: 为容器指定一个名称。

  • --publish list: 发布容器的端口到宿主机。

  • --restart string: 设置容器退出时的重启策略。

  • --volume list: 绑定挂载一个卷。

  • --workdir string: 设置容器内的工作目录。

[root@node2 ~]# docker container create busybox:latest  #container可以省略
0e5e7461faa76bb20d574c3abd4acfe111bc66731d71d9c89a52ded5ebbdf596
[root@node2 ~]# docker ps -a #默认状态为关闭
CONTAINER ID   IMAGE            COMMAND   CREATED         STATUS                          PORTS     NAMES
0e5e7461faa7   busybox:latest   "sh"      2 minutes ago   Exited (0) About a minute ago             vigilant_clarke

3.1.2 docker run创建容器

docker run命令用于从给定的映像创建并启动一个新的容器。

常用参数说明

  • -t:分配一个伪 TTY,这使得容器的标准输入、输出和错误流的行为类似于传统终端。这对于交互式应用程序很有用,因为它允许用户与容器进行交互,就像在一个真正的终端中一样。

  • -i:以交互模式运行容器。这允许您与容器的标准输入进行交互,通常与-t选项一起使用,以便在容器中启动一个交互式的shell会话。

  • --name:为容器指定名称。这对于识别和管理容器很有用,特别是在您需要引用特定容器时。

  • --network:指定容器的网络命名空间。这可用于将容器连接到特定网络,例如桥接网络或自定义网络。通过这个选项,您可以控制容器如何与外部世界通信,或者与其他容器通信。

  • --rm:容器退出时自动删除。这对于临时或一次性容器很有用,因为它可以帮助您避免在系统上留下不再需要的容器。

  • -d:以分离模式运行容器,这意味着它在后台运行并且不占用终端。这使得您可以在容器运行时返回到命令行,不会因为容器的输出而被打断。

  • -p:将主机上的端口映射到容器中的端口。这对于从主机外部访问容器内运行的服务非常有用。格式为hostPort:containerPort,例如,如果您有一个在容器内运行的web服务,并且它在容器内监听80端口,您可以使用-p 8080:80将主机的8080端口映射到容器的80端口。

  • -P:将所有暴露的端口发布到主机上的随机端口。当您想要公开容器的服务而不指定主机端口时,这非常有用。Docker会自动分配一个随机的主机端口,并将其映射到容器内的相应端口。

1、创建容器
[root@node2 ~]# docker run -d -p 81:80 nginx:latest  #如果镜像不存在会直接拉取
[root@node2 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                               NAMES
8ff703e1d131   nginx     "/docker-entrypoint.…"   38 seconds ago   Up 36 seconds   0.0.0.0:81->80/tcp, :::81->80/tcp   eloquent_shaw
​
注意:许多容器这样进去也不是UP状态,所以这里最好用 “-itd” 进来就会式UP状态
​
2、进入交互式模式并且退出后删除容器
[root@node2 ~]# docker run -it --rm mycentos7 bash
[root@3eeddc47d434 /]# exit      #快捷键Ctrl+D
[root@node2 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

3.2 启动和停止容器

3.2.1 停止容器

[root@node2 ~]# docker run -d -p 81:80 --name web1 nginx:latest
88d7d3242bfe3acb3af977d27097d1be637b2c97f9918e2ddb9fd082f3f17c83
[root@node2 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                               NAMES
88d7d3242bfe   nginx:latest   "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:81->80/tcp, :::81->80/tcp   web1
​
方式一:直接停止
[root@node2 ~]# docker stop web1
web1
[root@node2 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                     PORTS     NAMES
88d7d3242bfe   nginx:latest   "/docker-entrypoint.…"   25 seconds ago   Exited (0) 6 seconds ago             web1
​
方式二:杀容器
[root@node2 ~]# docker kill web1
web1
[root@node2 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                      PORTS     NAMES
88d7d3242bfe   nginx:latest   "/docker-entrypoint.…"   2 minutes ago   Exited (137) 1 second ago             web1

3.2.2 启动容器

docker start命令用于启动一个或多个已停止的容器,详细说明和使用方法:

  • -a, --attach:附加STDOUT/STDERR并转发信号。这意味着当容器启动时,您可以直接与容器的输出进行交互,并且可以通过发送信号来控制容器。

  • --detach-keys string:覆盖用于分离容器的键序列。这允许您自定义用于从容器分离的快捷键序列。

  • -i, --interactive:附加容器的STDIN。这使得您可以向容器的输入流发送数据,例如通过键盘输入。

[root@node2 ~]# docker start web1
web1
[root@node2 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                               NAMES
88d7d3242bfe   nginx:latest   "/docker-entrypoint.…"   5 minutes ago   Up 3 seconds   0.0.0.0:81->80/tcp, :::81->80/tcp   web1

3.3 列出容器

[root@node2 ~]# docker ps --help

docker ps命令用于列出Docker容器。它有多个选项可以用来过滤和格式化输出。以下是一些常用的选项和它们的用途:

  • -a, --all:显示所有容器,包括未运行的。默认情况下,只显示正在运行的容器。

  • -f, --filter filter:根据提供的条件过滤输出。例如,可以根据容器的名称、标签、状态、镜像等进行过滤。

  • --format string:使用Go模板格式化输出。这允许你自定义输出的格式。

  • -n, --last int:显示最近创建的n个容器。这包括所有状态的容器。

  • -l, --latest:显示最近创建的容器。这也包括所有状态的容器。

  • --no-trunc:不截断输出。默认情况下,某些输出可能会被截断,使用此选项可以显示完整的输出。

  • -q, --quiet:仅显示容器ID。这对于脚本或其他自动化任务非常有用,因为它只输出最简单的信息。

  • -s, --size:显示总的文件大小。这可以帮助你了解容器使用的存储空间

[root@node2 ~]# docker ps  #列出所用运行中的容器
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                               NAMES
88d7d3242bfe   nginx:latest   "/docker-entrypoint.…"   23 minutes ago   Up 18 minutes   0.0.0.0:81->80/tcp, :::81->80/tcp   web1
​
[root@node2 ~]# docker ps  #列出所有容器
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                               NAMES
508a84ef41ae   busybox        "sh"                     3 seconds ago    Up 2 seconds                                        cranky_ramanujan
88d7d3242bfe   nginx:latest   "/docker-entrypoint.…"   25 minutes ago   Up 20 minutes   0.0.0.0:81->80/tcp, :::81->80/tcp   web1
​
[root@node2 ~]# docker ps -aq  #显示所有容器ID
508a84ef41ae
88d7d3242bfe
​
[root@node2 ~]# docker ps -n1  #显示最近创建的一个容器
CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS              PORTS     NAMES
508a84ef41ae   busybox   "sh"      About a minute ago   Up About a minute             cranky_ramanujan

3.4 删除容器

docker rm命令用于删除一个或多个Docker容器。它有几个选项可以帮助你更灵活地管理容器:

  • -f, --force:强制删除正在运行的容器。这将使用SIGKILL信号来停止容器。

  • -l, --link:删除指定的链接,而不是底层的容器。这个选项默认为false,意味着如果指定了链接,那么只有链接会被删除,而不是容器本身。

  • -v, --volumes:删除与容器关联的匿名卷。这个选项默认为false,意味着如果容器有关联的卷,那么在删除容器时,这些卷不会被自动删除。

[root@node2 ~]# docker rm 1695910fcfde  #删除停止的容器
1695910fcfde
​
[root@node2 ~]# docker rm -f 508a84ef41ae  #强制删除,包括运行中的容器
​
[root@node2 ~]# docker rm -f `docker ps -aq`  #删除所有容器
508a84ef41ae
88d7d3242bfe

3.5 进入容器

方式一:使用 attach 命令

主要选项包括:

  • --detach-keys=[=]:指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q

  • --no-stdin=true|false:是否关闭标准输入,默认是保持打开。

  • --sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为true。

[root@node2 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
e0c0ebee9538   centos:7   "/bin/bash"   14 seconds ago   Up 13 seconds             centos7
[root@node2 ~]# docker attach centos7 
[root@e0c0ebee9538 /]#
​
注意:attach 命令有时候并不方便 当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
示例:
1、在终端1创建一个文件
[root@e0c0ebee9538 /]# cat test.txt 
这是终端1
​
2、在终端2查看
[root@node2 ~]# docker attach centos7
[root@e0c0ebee9538 /]# cat test.txt 
这是终端1

方法二:使用exec命令

[root@node2 ~]# docker exec --help

  • -d, --detach:在后台运行命令,不占用终端。

  • --detach-keys string:覆盖用于从容器分离的键序列。

  • -e, --env list:设置环境变量。

  • --env-file list:从文件中读取环境变量。

  • -i, --interactive:保持STDIN打开,即使没有附加。

  • --privileged:给命令扩展权限。

  • -t, --tty:分配一个伪终端。

  • -u, --user string:用户名或UID(格式:<name|uid>[:<group|gid>])。

  • -w, --workdir string:容器内的工作目录

[root@node2 ~]# docker exec -it centos7 bash
[root@17f713b47a6f /]# 

3.6 导出和导入容器

3.6.1 导出容器

方式一:

[root@node2 ~]# docker export -o centos7.tar centos7
[root@node2 ~]# ll
total 206728
-rw-------. 1 root root 211687936 Mar  3 08:28 centos7.tar

方式二:

[root@node2 ~]# docker export centos7 > centos7.9.tar
[root@node2 ~]# ll
total 413456
-rw-r--r--. 1 root root 211687936 Mar  3 08:29 centos7.9.tar
-rw-------. 1 root root 211687936 Mar  3 08:28 centos7.tar

注意:两种方式文件的权限不一样

3.6.2 导入容器

[root@node1 ~]# docker import --help

选项:

  • -c, --change list:在创建镜像时应用Dockerfile指令。它接受一个列表作为输入,用于指定要应用的Dockerfile指令。

  • -m, --message string:设置导入镜像的提交消息。这是一个字符串,用于为导入的镜像添加描述性消息。

[root@node1 ~]# docker import centos7.tar kxy/centos7:v1  #可以重新命名
sha256:4af33638d12a3326226acd787c7773f2e0310da0d4694224aa437dc810886330
[root@node1 ~]# docker images     #导进来是镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
kxy/centos7         v1                  4af33638d12a        14 seconds ago      204MB
busybox             latest              3f57d9401f8d        6 weeks ago         4.26MB
centos              7                   eeb6ee3f44bd        2 years ago         204MB

注意:

docker loaddocker import命令都可以用来将镜像或容器数据导入到Docker环境中,但它们的用途和处理方式有所不同。

  • docker load用于从tarball(归档文件)加载镜像。这个命令主要用于从docker save命令导出的tarball中恢复镜像。当你使用docker save命令导出镜像时,它会保留镜像的所有历史记录和元数据信息,这意味着加载的镜像将与原始镜像完全相同,包括所有的层和标签。

  • docker import用于从容器的文件系统快照创建一个新的Docker镜像。这个命令主要用于从docker export命令导出的容器快照中恢复数据。与docker save不同,docker import会创建一个新的镜像,但在这个过程中会丢弃容器的所有历史记录和元数据信息。这意味着导入的镜像将不包含任何历史记录,只包含容器快照时的文件系统状态。

主要区别在于:

  • 容器快照文件(通过docker export导出)将丢弃所有的历史记录和元数据信息,仅保存容器当时的快照状态。这使得导入的镜像体积更小,但没有历史记录和元数据信息。

  • 镜像存储文件(通过docker save导出)将保存完整记录,包括所有的历史记录和元数据信息。这使得导入的镜像体积更大,但包含了完整的镜像信息。

3.7 查看容器进程

[root@node2 ~]# docker top centos7 
UID     PID     PPID     C     STIME     TTY      TIME       CMD
root    31708   31686    0     08:22     pts/0    00:00:00   /bin/bash

4. Docker命令选项总结

[root@node2 ~]# docker --help

选项:

--config string:指定客户端配置文件的位置。默认为/root/.docker.

-D, --debug:启用调试模式。

-H, --host list:指定要连接的守护程序套接字。

-l, --log-level string:设置日志记录级别。选项包括“调试”、“信息”、“警告”、“错误”、“致命”。默认为“信息”。

--tls:使用 TLS。由 暗示--tlsverify。

--tlscacert string:指定CA证书文件的路径。默认为/root/.docker/ca.pem.

--tlscert string:指定 TLS 证书文件的路径。默认为/root/.docker/cert.pem.

--tlskey string:指定 TLS 密钥文件的路径。默认为/root/.docker/key.pem.

--tlsverify:使用 TLS 并验证远程。 • -v, --version:打印版本信息并退出。

管理:

builder:管理构建。

config:管理 Docker 配置。

container:管理容器。

engine:管理 Docker 引擎。

image:管理图像。

network:管理网络。

node:管理 Swarm 节点。

plugin:管理插件。

secret:管理 Docker 机密。

service:管理服务。

stack:管理 Docker 堆栈。

swarm:管理 Swarm。

system:管理 Docker。

trust:管理对 Docker 镜像的信任。

volume:管理卷。

指令:

attach:将本地标准输入、输出和错误流附加到正在运行的容器。

build:从 Dockerfile 构建镜像。

commit:根据容器的更改创建新映像。

cp:在容器和本地文件系统之间复制文件/文件夹。

create:创建一个新容器。

diff:检查容器文件系统上文件或目录的更改。

events:从服务器获取实时事件。

exec:在正在运行的容器中运行命令。

export:将容器的文件系统导出为 tar 存档。

history:显示图像的历史记录。

images:列出图像。

import:从 tarball 导入内容以创建文件系统映像。

info:显示系统范围的信息。

inspect:返回 Docker 对象的低级信息。

kill:杀死一个或多个正在运行的容器。

load:从 tar 存档或 STDIN 加载图像。

login:登录 Docker 注册表。

logout:从 Docker 注册表注销。

logs:获取容器的日志。

pause:暂停一个或多个容器内的所有进程。

port:列出容器的端口映射或特定映射。

ps:列出容器。

pull:从注册表中提取映像或存储库。

push:将映像或存储库推送到注册表。

rename:重命名容器。

restart:重新启动一个或多个容器。

rm:移除一个或多个容器。

rmi:删除一张或多张图像。

run:在新容器中运行命令。

save:将一个或多个图像保存到 tar 存档(默认情况下流式传输到 STDOUT)。

search:在 Docker Hub 中搜索镜像。

start:启动一个或多个停止的容器。

stats:实时显示容器资源使用统计数据。

stop:停止一个或多个正在运行的容器。

tag:创建引用 SOURCE_IMAGE 的标签 TARGET_IMAGE。

top:显示容器正在运行的进程。

unpause:取消暂停一个或多个容器内的所有进程。

update:更新一个或多个容器的配置。

version:显示Docker版本信息。

wait:阻塞直到一个或多个容器停止,然后打印它们的退出代码。

5. Docker仓库管理

5.1 DockerHub

网址:https://hub.docker.com/

如果有账号直接登录,没有就注册!

我这里用谷歌账号登录的!!!

[root@node2 ~]# docker login  #登录,默认登录的是DockerHub
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: kongxiangyu200210013
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
​
Login Succeeded

5.2 阿里云

网址:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台欢迎登录阿里云,全球领先的云计算及人工智能科技公司,阿里云为200多个国家和地区的企业、开发者和政府机构提供云计算基础服务及解决方案。阿里云云计算、安全、大数据、人工智能、企业应用、物联网等云计算服务。icon-default.png?t=N7T8https://cr.console.aliyun.com/cn-hangzhou/instance/repositories

创建仓库!绑定GitHub

[root@node2 ~]# docker logout   #退出
Removing login credentials for https://index.docker.io/v1/
​
[root@node2 ~]# docker login --username=alykxy1511327912 registry.cn-chengdu.aliyuncs.com
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
​
Login Succeeded
  • 注册成功后,本地用户目录下会自动创建 docker config on 文件,保存用户的认证信息

[root@node2 ~]# cd .docker/
[root@node2 .docker]# ll
total 4
-rw-------. 1 root root 116 Mar  3 09:43 config.json
[root@node2 .docker]# cat config.json 
{
        "auths": {
                "registry.cn-chengdu.aliyuncs.com": {
                        "auth": "YWx5a3h5MTUxMTMyNzkxMjoxNTExMzI3OTEyS3h5"
                }
        }
}

可以通过Web界面管理镜像

5.3 向阿里云推送镜像

[root@node2 ~]# docker tag centos:7 registry.cn-·chengdu.aliyuncs.com/xiangyukong/kxy:centos7_v1  #打包
[root@node2 ~]# docker push registry.cn-chengdu.aliyuncs.com/xiangyukong/kxy:centos7_v1 
The push refers to repository [registry.cn-chengdu.aliyuncs.com/xiangyukong/kxy]
174f56854903: Pushed 
centos7_v1: digest: sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f size: 529
​
注意:不写仓库地址默认为DockerHub

具体根据自己的阿里云的仓库管理来看

5.4 搭建私有仓库

环境:CentOS 7.9

5.4.1 使用官方的registry 创建私有仓库(了解)

[root@node2 ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry:2
Unable to find image 'registry:2' locally
2: Pulling from library/registry
619be1103602: Pull complete 
2ba4b87859f5: Pull complete 
0da701e3b4d6: Pull complete 
14a4d5d702c7: Pull complete 
d1a4f6454cb2: Pull complete 
Digest: sha256:f4e1b878d4bc40a1f65532d68c94dcfbab56aa8cba1f00e355a206e7f6cc9111
Status: Downloaded newer image for registry:2
da2175f873ef0595af0eca0f5ab6e41205e2111192c5be96a5672e03cb0b2288
参数解释:
    -p 5000:5000:将主机的端口 5000 映射到容器的端口 5000,使得外部可以通过主机的 5000 端口访问容器内     的服务。
    -v /opt/data/registry:/var/lib/registry:将主机的目录"/opt/data/registry"挂载到容器         的"/var/lib/registry"目录,实现数据共享。
​
[root@node2 ~]# docker port da2175f873ef
5000/tcp -> 0.0.0.0:5000
5000/tcp -> :::5000
5.4.1.1 上传镜像
[root@node2 ~]# docker tag busybox:latest 192.168.110.21:5000/busybox:v1  #打包
[root@node2 ~]# docker push 192.168.110.21:5000/busybox:v1  #注意默认为HTTP要求为HTTPS
Get "https://192.168.110.21:5000/v2/": http: server gave HTTP response to HTTPS client
​
解决办法:
[root@node2 ~]# docker rm -f `docker ps -aq`
[root@node2 ~]# vim /etc/docker/daemon.json
{
        "insecure-registries": ["192.168.110.21:5000"]
}
[root@node2 ~]# systemctl daemon-reload 
[root@node2 ~]# systemctl restart docker
[root@node2 ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry:2
[root@node2 ~]# docker push 192.168.110.21:5000/busybox:v1
The push refers to repository [192.168.110.32:5000/busybox]
2e112031b4b9: Pushed 
v1: digest: sha256:d319b0e3e1745e504544e931cde012fc5470eba649acc8a7b3607402942e5db7 size: 527
5.4.1.2 部署registry-web
[root@node1 ~]# docker ps -aq
f40f9764f5d1
[root@node2 ~]# docker run -d -p 8080:8080 --name registry-web --restart=always --link f40f9764f5d1 -e registry_url=http://192.168.110.21:5000/v2 -e registry_name=localhost:5000 hyper/docker-registry-web:latest

命令解释:

  1. --link标志的误用--link标志用于将容器相互连接,以便它们可以相互通信。你使用的语法是--link f40f9764f5d1,这是错误的,因为它缺少了别名部分。正确的语法是--link <name or id>:alias。在你的情况下,似乎你正在尝试链接到一个ID为f40f9764f5d1的容器,但你没有为此链接提供别名。如果这个链接的目的是连接到一个注册表,确保你链接到了正确的容器,并提供了适当的别名。例如,如果f40f9764f5d1是你的注册表容器,你可能使用--link f40f9764f5d1:registry

  2. 环境变量:你使用-e registry_url=http://192.168.110.21:5000/v2-e registry_name=localhost:5000来设置环境变量。这是正确的,但确保registry_url对于registry-web容器是可访问的。如果注册表运行在不同的主机或端口上,你可能需要相应地调整URL。

  3. 镜像名称:镜像名称hyper/docker-registry-web:latest似乎是正确的,假设你正在使用Hyper提供的Docker注册表Web界面。然而,确保镜像名称和标签是正确的,并且镜像在你的Docker环境中可用。

  4. 遗留特性警告--link标志被视为遗留特性,可能在未来的Docker版本中被移除。建议使用用户定义的网络代替容器通信。如果你的设置依赖于--link进行网络连接,考虑迁移到用户定义的桥接网络或另一种网络解决方案。

这里一定要用CentOS 7.9 ,openEuler这里一直是restart用不了

5.4.2 harbor搭建私有仓库

Harbor是一个基于Docker Distribution(原名为Docker Registry V2,现名为distribution)的开源企业级容器镜像仓库,它提供了丰富的功能来满足企业对于镜像仓库的需求,包括安全性、访问控制和管理等。Harbor在Docker Distribution的基础上,增加了一些额外的特性,使其更适合在企业环境中使用。

Harbor的主要特点包括:

  • 安全性:Harbor提供了强大的安全特性,包括用户管理、角色管理、项目管理以及支持HTTPS和证书管理。这些特性确保了镜像仓库的安全性,防止未授权的访问和滥用。

  • 访问控制:Harbor支持细粒度的访问控制,允许管理员设置不同级别的权限,比如只读、读写等,以满足不同的用户需求。

  • 管理功能:Harbor提供了丰富的管理功能,包括镜像版本管理、漏洞扫描、映像签名、镜像复制等。这些功能使得管理员能够更好地控制和管理镜像仓库。

  • 易用性:Harbor的用户界面设计得非常直观,使得用户可以轻松地管理和使用镜像仓库。

  • 高可用性和扩展性:Harbor支持高可用性配置,并且可以通过扩展来满足大规模的需求。

  • 与CI/CD集成:Harbor与多种CI/CD工具(如Jenkins、GitLab CI/CD、GitHub Actions等)集成,使得构建、测试和部署流程更加顺畅。

5.4.2.1 harbor安装部署
[root@node2 ~]# wget -c https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
[root@node2 ~]# tar xf harbor-offline-installer-v2.10.0.tgz -C /usr/local/

安装docker-compose

[root@node2 ~]# wget -c https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-linux-x86_64
5.4.2.2 配置harbor
[root@node2 ~]# cp /usr/local/harbor/harbor.yml.tmpl /usr/local/harbor/harbor.yml
[root@node2 ~]# sed -i '/^hostname: / c hostname: reg.openlab.cn/' /usr/local/harbor/harbor.yml
​
[root@node2 ~]# vim /usr/local/harbor/harbor.yml  #将https模块注释
# https related config
#https:
  # https port for harbor, default is 443
  #port: 443
  # The path of cert and key files for nginx
  #certificate: /your/certificate/path
  #private_key: /your/private/key/path
[root@node2 ~]# mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
[root@node2 ~]# chmod +x /usr/local/bin/docker-compose
[root@node2 ~]# /usr/local/harbor/install.sh   #运行
[root@node1 ~]# docker ps  #确定都是UP
CONTAINER ID   IMAGE                                COMMAND                  CREATED          STATUS                             PORTS                                   NAMES
b40ed882ce6a   goharbor/nginx-photon:v2.8.4         "nginx -g 'daemon of…"   35 seconds ago   Up 31 seconds (healthy)            0.0.0.0:80->8080/tcp, :::80->8080/tcp   nginx
e747e8fbc7de   goharbor/harbor-jobservice:v2.8.4    "/harbor/entrypoint.…"   35 seconds ago   Up 27 seconds (health: starting)                                           harbor-jobservice
c43f2be38c90   goharbor/harbor-core:v2.8.4          "/harbor/entrypoint.…"   35 seconds ago   Up 32 seconds (healthy)                                                    harbor-core
c0d3ee6a5aa8   goharbor/registry-photon:v2.8.4      "/home/harbor/entryp…"   35 seconds ago   Up 32 seconds (healthy)                                                    registry
a42fd0a6975d   goharbor/harbor-portal:v2.8.4        "nginx -g 'daemon of…"   35 seconds ago   Up 32 seconds (healthy)                                                    harbor-portal
f128ab4a904c   goharbor/harbor-registryctl:v2.8.4   "/home/harbor/start.…"   35 seconds ago   Up 32 seconds (healthy)                                                    registryctl
bb9e43bb530f   goharbor/harbor-db:v2.8.4            "/docker-entrypoint.…"   35 seconds ago   Up 32 seconds (healthy)                                                    harbor-db
897eb3b6d78b   goharbor/redis-photon:v2.8.4         "redis-server /etc/r…"   35 seconds ago   Up 32 seconds (healthy)                                                    redis
bfb91f50fbd2   goharbor/harbor-log:v2.8.4           "/bin/sh -c /usr/loc…"   35 seconds ago   Up 33 seconds (healthy)            127.0.0.1:1514->10514/tcp               harbor-log
5.4.2.3 访问测试

新建项目

6. Docker数据管理

6.1 数据管理

  • 数据卷 Data Volumes 个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于 Linux 中的 mount行为。

6.1.1 创建数据卷

[root@node1 ~]# docker volume --help

  • create:创建一个新的卷。如果没有指定名称,Docker会生成一个随机名称。

  • inspect:显示一个或多个卷的详细信息。

  • ls:列出所有的卷。

  • prune:移除所有未使用的本地卷。

  • rm:移除一个或多个卷。

[root@node1 ~]# docker volume create -d local test  #创建
test
[root@node1 ~]# docker volume ls   #列出
DRIVER    VOLUME NAME
local     test
[root@node1 ~]# docker volume inspect test  #显示详细信息
[
    {
        "CreatedAt": "2024-03-05T15:54:14+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/test/_data",
        "Name": "test",
        "Options": {},
        "Scope": "local"
    }
]
[root@node1 ~]# docker volume rm test   #删除
test
  • CreatedAt:卷创建的时间。在这个例子中,卷于2024年3月5日15点54分在北京时间创建。

  • Driver:卷使用的驱动程序。这里是local,意味着这是一个本地存储的卷。

  • Labels:卷的标签,这里是空的,表示没有给这个卷添加任何标签。

  • Mountpoint:卷在宿主机上的挂载点。这个卷被挂载到/var/lib/docker/volumes/test/_data

  • Name:卷的名称。这个卷的名称是test

  • Options:卷的选项,这里是空的,表示没有额外的选项设置。

  • Scope:卷的作用域。这里是local,表示这个卷是本地的,只能在创建它的Docker守护进程上使用。

6.1.2 绑定数据卷

6.1.2.1 使用--mount(了解)

在使用docker run命令启动容器时,可以使用--mount选项来使用数据卷。--mount选项支持三种类型的数据卷,包括:

  1. volume:普通数据卷,映射到主机的/var/lib/docker/volumes路径下。这种类型的卷由Docker完全管理,具有许多优势,如更容易备份或迁移,可以通过Docker CLI命令或Docker API管理,可以在Linux和Windows容器上工作,可以更安全地在多个容器之间共享,卷驱动程序允许您在远程主机或云提供商上存储卷、加密卷的内容或添加其他功能等。

  2. bind:绑定数据卷,映射到主机指定路径下。绑定数据卷是一种高性能的连接方式,允许容器直接访问主机上的文件系统。这种方式可以使主机的文件系统与容器共享,可以设置为只读或读写。这对于需要在容器中使用主机文件系统的场景非常有用,例如执行不想在主机上安装的工具,或者在容器中运行工作,这些工作需要访问主机的文件。

  3. tmpfs:临时数据卷,只存在于内存中。如果容器生成的是非持久状态数据,可以考虑使用tmpfs挂载来避免将数据永久存储在任何地方,同时通过避免写入容器的可写层来提高容器的性能

[root@node1 ~]# mkdir /webapp  #使用--mount不会自动创建目录
[root@node1 ~]# docker run -it -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp training/webapp python app.py
  • -d 使容器在后台运行。

  • -P 将容器内部的所有公开端口映射到主机的随机端口。

  • --name web 为容器指定名称 web

  • --mount type=bind,source=/webapp,destination=/opt/webapp 将主机目录 /webapp 挂载到容器内的 /opt/webapp。这是一个绑定挂载(bind mount),允许容器访问并修改主机的目录。

  • training/webapp 旨在指定使用的镜像,但可能存在误解。通常,指定镜像的格式是 repository/image:tag。如果 training 是仓库,webapp 是镜像,则正确的格式应该是 training/webapp

  • python app.py 是在容器内执行的命令,用于运行Python应用程序。

注意:本地一定要是绝对路径,容器内可以是相对路径

6.1.2.2 使用-v(推荐这种方式)

示例一:

  • 创建了一个名为 /web 的数据卷,并将其挂载到容器的 /web 目录下。数据卷是由 Docker 管理的,存储在宿主机的 /var/lib/docker/volumes/ 目录下

  • 这种方式的优势是数据持久化,即使容器被删除,数据卷中的数据仍然存在,可以被其他容器重新挂载和使用。

[root@node1 ~]# docker run -it -v /web centos:7 bash   #-v会自动创建目录
[root@8e08fba4d754 /]# cd /web/
[root@8e08fba4d754 web]# echo 1234 > a.txt
[root@8e08fba4d754 web]# cat a.txt 
1234
[root@8e08fba4d754 web]# exit
[root@node1 _data]# cat /var/lib/docker/volumes/4595ded04541586af9abbea5eb015e5f29930202e3e3bb2a181531c982a3f5dc/_data/a.txt
1234
#相当于容器内的内容记录到了 /var/lib/docker/volumes/ 目录下

示例二:

  • 创建了一个绑定挂载,将宿主机的 /data/test 目录挂载到容器的 /web 目录下。这意味着容器内的 /web 目录直接对应于宿主机的 /data/test 目录。

  • 绑定挂载提供了更高的灵活性,因为它可以直接访问宿主机的文件系统。但是,这种方式的缺点是数据不会被 Docker 管理,因此如果容器被删除,数据可能会丢失,除非您手动管理数据的生命周期。

[root@node1 ~]# mkdir /data/test -p
[root@node1 ~]# docker run -it -v /data/test:/web centos:7 bash ##将容器中的/web目录和主机的/data/test目录关联
[root@f8d0618fcd5a /]# echo hello world > /web/a.txt
[root@f8d0618fcd5a /]# cat /web/a.txt 
hello world
[root@f8d0618fcd5a /]# exit
[root@node1 ~]# cat /data/test/a.txt  #数据持久化保存
hello world

6.2 数据卷容器管理

  • 实现容器之间共享数据

1、创建db1容器
[root@node1 ~]# docker run -it -v /data/test/:/dbdata --name db1 centos:7 bash
[root@5450a2dd000c /]# echo 'test' > /dbdata/b.txt
[root@5450a2dd000c /]# exit
​
2、与其他容器共享数据
[root@node1 ~]# docker run -it --volumes-from db1 --name db2 centos:7 bash
[root@7794104d9dc2 /]# ll /dbdata/ -d
drwxr-xr-x 2 root root 4096 Mar  5 08:56 /dbdata/
[root@7794104d9dc2 /]# cat /dbdata/b.txt 
test
  • --volumes-from db1:这个选项告诉Docker从名为db1的容器中复制数据卷。这意味着db2容器将包含db1容器中的所有数据卷。

  • --name db2:这个选项用于为新启动的容器指定一个名称,这里指定的名称是db2

  • 使用--volumes-from选项时,可以指定一个或多个容器,通过重复--volumes-from参数来复制多个容器的数据卷。此外,容器ID可以选择性地后缀为:ro:rw,以分别以只读或读写模式挂载数据卷。默认情况下,Docker会以与参考容器相同的模式(读写或只读)挂载数据卷

6.3 删除关联容器

  • 使用 --volumes-from 参数挂载数据卷的容器不需要保持运行状态。这意味着,即使数据卷容器(如 dbdata、db1 和 db2)被删除,其挂载的数据卷也不会自动被删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。这样做的好处是,它允许用户在容器之间升级和移动数据卷,而不会丢失数据。

[root@node1 ~]# docker rm db1
db1
[root@node1 ~]# docker start db2 
db2
[root@node1 ~]# docker exec -it db2 bash
[root@7794104d9dc2 /]# cat /dbdata/b.txt   #删除一个另一个如数据不会删除
test
[root@node1 ~]# docker rm -v db2  #删除最后一个关联容器时需要加-v

6.4 数据卷的备份和恢复

6.4.1 备份

[root@node1 ~]# docker run -it -v /data/test/:/dbdata --name db centos:7 bash
[root@8cba609cf7dc /]# echo hello > /dbdata/hello.txt
[root@8cba609cf7dc /]# echo hello1 > /dbdata/hello1.txt
[root@8cba609cf7dc /]# echo hello2 > /dbdata/hello2.txt
[root@8cba609cf7dc /]# ls /dbdata/
b.txt  hello.txt  hello1.txt  hello2.txt
[root@node1 ~]# docker run --volumes-from db --name dbbackup -v $(pwd):/backup centos:7 tar cf /backup/test.tar /dbdata
--volumes-from db:该选项告诉Docker从名为db的容器中复制所有数据卷。这意味着dbbackup将包含db容器中的所有数据卷。
--name dbbackup:该选项用于为新启动的容器指定一个名称,这里指定的名称是dbbackup。
-v $(pwd):/backup:该选项将当前目录(由$(pwd)获取)挂载到容器的/backup目录。这样,容器内的/backup目录将链接到容器内的目录,使得容器内的/backup目录可以访问到容器内的目录。
centos:7:这是容器的镜像名称,它指定了要启动的容器使用哪个Docker镜像。这里指定是CentOS 7的镜像。
tar cf /backup/test.tar /dbdata:这是在容器内执行的命令,用于备份/dbdata目录的内容到/backup/test.tar文件中。tar命令是用于创建、查看、tar归档文件的工具,cf修改选项表示创建新的tar归档文件。
[root@node1 ~]# ll
total 12
-rw-r--r-- 1 root root 10240 Mar  5 18:49 test.tar

6.4.2 恢复

[root@node1 ~]# docker run -itd -v /dbdata --name db2 centos:7   #再运行个容器
b01bfda236ded22c1f5dde9b83ea68badbae262ad8587a877a9afba2a87493f1
[root@node1 ~]# docker run --volumes-from db2 -v $(pwd):/backup centos:7 tar xf /backup/test.tar  #将及内容导入到db2容器
[root@node1 ~]# docker exec -it db2 bash  
[root@b01bfda236de /]# ll /dbdata/
total 16
-rw-r--r-- 1 root root 5 Mar  5 09:28 b.txt
-rw-r--r-- 1 root root 6 Mar  5 10:45 hello.txt
-rw-r--r-- 1 root root 7 Mar  5 10:45 hello1.txt
-rw-r--r-- 1 root root 7 Mar  5 10:45 hello2.txt

7. Docker端口映射

7.1 随机端口映射

[root@node1 ~]# docker run -itd --name web1 -P nginx 
[root@node1 ~]# docker port web1 
80/tcp -> 0.0.0.0:49159
80/tcp -> :::49159

7.2 指定映射端口

[root@node1 ~]# docker run -itd --name web2 -p 81:80 nginx
[root@node1 ~]# docker port web2 
80/tcp -> 0.0.0.0:81
80/tcp -> :::81

7.3 指定主机IP随机端口映射

[root@node1 ~]# docker run -itd --name web3 -p 127.0.0.1::80 nginx
[root@node1 ~]# docker port web3 
80/tcp -> 127.0.0.1:49153
[root@node1 ~]# curl localhost:49153  #只有本地可以访问
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

7.4 指定主机IP指定端口

[root@node1 ~]# docker run -itd --name web4 -p 127.0.0.1:8080:80 nginx
[root@node1 ~]# docker port web4
80/tcp -> 127.0.0.1:8080
[root@node1 ~]# curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

8. Docker容器互联

  • 使用--link参数可以让容器之间安全地进行交互。--link参数允许一个容器连接到另一个容器,从而实现容器间的通信。这在Docker中是一种传统的方式,用于连接容器并共享网络命名空间,使得连接的容器能够通过容器名直接访问另一个容器的服务。

  • 使用Docker容器互联搭建论坛

[root@node1 ~]# docker run -d --name db --env MYSQL_ROOT_PASSWORD=123456 mysql
[root@node1 ~]# docker run --name bbs -d -p 80:80 --link db:dbsql tencentci/discuz
  • --name bbs:该选项用于为新启动的容器指定一个名称,这里指定的名称是bbs

  • -d:该选项使容器在后台运行,而不是在前台。

  • -p 80:80:该选项将容器的 80 端口映射到一台机的 80 端口。这意味着 Discuz 论坛将可以通过一台机的 80 端口访问。

  • --link db:dbsql:该选项创建一个链接到名为db容器的链接,并为该链接分配别名dbsql。这使得bbs容器可以通过dbsql别名访问db容器提供的服务,如数据库服务。

  • tencentci/discuz:这是容器的镜像名称,它指定了要启动的容器使用哪个Docker镜像。这里指定是腾讯CI的Discuz论坛镜像。

8.1 访问

9. Docker网路管理

9.1 Docker的四种网络模式

[root@node1 ~]# docker network ls
NETWORK ID   NAME   DRIVER  SCOPE
d7762796e99c  bridge  bridge  local
d867b99d4a90  host   host   local
567eb312cb91  none   null   local
  • Host:该模式消除了容器与 Docker 主机之间的网络隔离,允许容器直接使用主机的网络。它是使用 指定的--net=host。此模式对于需要直接与主机网络交互而无需任何隔离的容器非常有用。

  • Container:此模式允许容器共享另一个容器的网络堆栈。创建的容器使用指定容器的IP地址和端口范围。它是使用 指定的--net=container:NAMEorID。这对于需要相互通信但不需要自己的网络堆栈的容器非常有用。

  • None:此模式禁用容器的网络,将其与所有网络接口隔离。它是使用 指定的--net=none。此模式适用于不需要任何网络连接的容器。

  • bridge:这是默认的网络模式。它创建主机内部的专用网络,为容器提供网络隔离。每个容器从子网获取自己的 IP 地址,并且可以与同一网络上的其他容器进行通信。它是使用 指定的--net=bridge,如果没有指定其他网络模式,则它是默认模式。

[root@node1 ~]# docker network --help

  • create: 创建一个新的网络。可以通过指定网络驱动(如bridge、overlay)和其他选项来创建网络。例如,docker network create --driver bridge my_bridge_network创建一个名为my_bridge_network的桥接网络。

  • inspect: 显示一个或多个网络的详细信息,包括网络的配置、连接的容器等。例如,docker network inspect bridge显示默认桥接网络的详细信息。

  • ls: 列出Docker主机上的所有网络。运行docker network ls可以看到所有网络的列表,包括它们的ID、名称、驱动和范围。

  • connect: 将容器连接到一个网络。这对于将正在运行的容器添加到一个网络非常有用。例如,docker network connect my_bridge_network my_container将my_container连接到my_bridge_network。

  • disconnect: 从网络中移除容器。例如,docker network disconnect my_bridge_network my_container将my_container从my_bridge_network中断开连接。

  • rm: 删除一个网络。在删除网络之前,确保没有容器连接到它。使用docker network rm my_bridge_network来删除my_bridge_network。

  • prune: 删除所有未使用的网络。docker network prune可以帮助清理那些不再被任何容器使用的网络。

9.1.1 Host网络

[root@node1 ~]# docker run -it --rm --network host busybox:latest
/ # ip address show ens160   #和主机共用IP
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
    link/ether 00:0c:29:ae:0c:7f brd ff:ff:ff:ff:ff:ff
    inet 192.168.110.31/24 brd 192.168.110.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feae:c7f/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
/ # ping 8.8.8.8  #可以访问互联网
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=128 time=183.553 ms
64 bytes from 8.8.8.8: seq=1 ttl=128 time=183.307 ms

9.1.3 Bridge网络

[root@node1 ~]# docker run -it --rm  busybox:latest  #实际就是NAT网络,不写默认为Bridge
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=127 time=184.917 ms
64 bytes from 8.8.8.8: seq=1 ttl=127 time=183.230 ms

9.1.4 None网络

[root@node1 ~]# docker run -it --rm  --network none busybox:latest  #隔离
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
/ # ping 8.8.8.8  #无网络
PING 8.8.8.8 (8.8.8.8): 56 data bytes
ping: sendto: Network is unreachable

9.1.5 Container网络

[root@node1 ~]# docker run -it --rm --name n1 busybox:latest    #创建n1容器
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
​
[root@node1 ~]# docker run -it --rm --name n2 --network container:n1 busybox:latest  #创建n2容器指定网络和n1共用
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

10. Docker镜像制作

10.1 Dockerfile指令

10.1.1 配置指令

  • ARG:定义创建镜像过程中使用的变量。

  • FROM:指定所创建镜像的基础镜像。

  • LABEL:为生成的镜像添加元数据标签信息。

  • EXPOSE:声明镜像内服务监听的端口。

  • ENV:指定环境变量。

  • ENTRYPOINT:指定镜像的默认入口命令。

  • VOLUME:创建一个数据卷挂载点。

  • USER:指定运行容器时的用户名或 UID。

  • WORKDIR:设置工作目录。

  • ONBUILD:创建子镜像时指定自动执行的操作指令。

  • STOPSIGNAL:指定退出的信号值。

  • HEALTHCHECK:配置所启动容器如何进行健康检查。

  • SHELL:指定默认 shell 类型。

10.1.2 操作指令

  • RUN:运行指定命令。这个指令在构建镜像过程中执行命令,并将结果提交到新的镜像层。每个RUN指令都会创建一个新的镜像层,因此尽量合并多个命令到一个RUN指令中,以减少镜像的层数和大小。

  • CMD:启动容器时指定默认执行的命令。这个指令定义了容器启动时默认执行的命令和参数。如果在运行容器时指定了命令,则CMD指定的命令会被覆盖。

  • ADD:添加内容到镜像。这个指令可以将文件、目录或远程文件添加到镜像中。与COPY不同的是,ADD还可以自动解压压缩文件。

  • COPY:复制内容到镜像。这个指令将文件或目录从构建上下文复制到镜像中。COPY更加简单,只用于复制文件和目录,而不支持自动解压

10.1.3 构建一个简单的web界面镜像

[root@node1 ~]# mkdir /docker
[root@node1 ~]# cd /docker/
[root@node1 docker]# vim Dockerfile   #必须叫Dockerfile严格区分大小写
ARG VER=latest
FROM busybox:$VER
MAINTAINER kxy<kxy@163.com>
ENV WEB_DOC_ROOT="/data/web/html"
RUN mkdir -p ${WEB_DOC_ROOT} && \
echo "<h1>Busybox httpd server</h1>" > ${WEB_DOC_ROOT}/index.html
EXPOSE 80
CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
​
[root@node1 docker]# docker build -t web:v1 ./   #构建镜像
[root@node1 docker]# docker run -d --name test1 -P web:v1 
[root@node1 docker]# docker port test1 
80/tcp -> 0.0.0.0:32768

Dockerfile文件解释:

  • ARG VER=latest:这是定义一个构建参数 VER,并将其设置为 latest。这通常用于在构建过程中传递特定的版本信息。

  • FROM busybox:$VER:指定基础镜像为 busybox,并使用构建参数 VER 来指定具体的版本。

  • MAINTAINER kxy<kxy@163.com>:指定维护者的信息,这里是 kxy,并提供了其电子邮件地址。

  • ENV WEB_DOC_ROOT="/data/web/html":设置环境变量 WEB_DOC_ROOT,将其值定义为 /data/web/html

  • RUN mkdir -p ${WEB_DOC_ROOT} && echo "<h1>Busybox httpd server</h1>" > ${WEB_DOC_ROOT}/index.html:运行命令创建目录结构,并将特定的文本内容写入到指定的文件中。

  • EXPOSE 80:声明容器将暴露的端口为 80,这意味着可以通过访问该端口与容器进行通信。

  • CMD /bin/httpd -f -h ${WEB_DOC_ROOT}:设置容器启动时默认执行的命令,这里是运行 httpd 服务,并指定了相关的参数。

访问:

10.1.4 使用copy方式

[root@node1 docker]# echo '<h1>dockerfile test</h1>' > index.html
[root@node1 docker]# vim Dockerfile
ARG VER=latest
FROM busybox:$VER
MAINTAINER kxy<kxy@163.com>
ENV WEB_DOC_ROOT="/data/web/html"
RUN mkdir -p ${WEB_DOC_ROOT}
COPY index.html ${WEB_DOC_ROOT}/index.html
EXPOSE 80
CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
​
[root@node1 docker]# docker build -t web:v2 ./
[root@node1 docker]# docker run -d --name test2 -P web:v2 
[root@node1 docker]# docker port test2 
80/tcp -> 0.0.0.0:32770

Dockerfile文件解释:

  • COPY:这是 Dockerfile 中的一个指令,用于将文件或目录从构建上下文复制到 Docker 镜像中。

  • index.html:这是要复制的源文件。它可能是在构建上下文(通常是与 Dockerfile 同一目录或其子目录)中的一个文件。

  • ${WEB_DOC_ROOT}/index.html:这是目标复制路径。${WEB_DOC_ROOT} 是之前定义的环境变量或固定的路径,/index.html 是文件在目标位置的具体路径。

访问:

10.2 docker build命令详解

docker build命令是用于构建Docker镜像的命令行工具,它根据Dockerfile中的指令创建Docker镜像。

  • --add-host:添加自定义的主机到IP映射。

  • --build-arg:设置构建时的变量。

  • --cache-from:指定作为缓存源的镜像。

  • --cgroup-parent:指定容器的可选父cgroup。

  • --compress:使用gzip压缩构建上下文。

  • --cpu-period:限制CPU CFS (Completely Fair Scheduler) 周期。

  • --cpu-quota:限制CPU CFS (Completely Fair Scheduler) 配额。

  • -c 或--cpu-shares:设置CPU份额(相对权重)。

  • --cpuset-cpus:指定允许执行的CPU。

  • --cpuset-mems:指定允许执行的MEM。

  • --disable-content-trust:跳过镜像验证。

  • -f 或--file:指定Dockerfile的名称(默认为'PATH/Dockerfile')。

  • --force-rm:始终移除中间容器。

  • --iidfile:将镜像ID写入文件。

  • --isolation:容器隔离技术。

  • --label:设置镜像的元数据标签。

  • --memory:设置内存限制。

  • --memory-swap:设置内存加交换空间的限制。

  • --network:设置RUN指令在构建期间的网络模式。

  • --no-cache:不使用缓存构建镜像。

  • --pull:始终尝试拉取镜像的新版本。

  • --quiet:抑制构建输出,并在成功时打印镜像ID。

  • --rm:构建成功后移除中间容器。

  • --security-opt:安全选项。

  • --shm-size:设置/dev/shm的大小。

  • -t 或--tag:设置镜像名称和标签。

  • --target:设置目标构建阶段。

  • --ulimit:设置ulimit选项。

如果需要自己命名Dockerfile文件需要加-f
[root@node1 docker]# mv Dockerfile Containerdfile
[root@node1 docker]# docker build -f Containerdfile -t web_v3 ./
[root@node1 docker]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
web_v3              latest              f8034ac90e98        16 minutes ago      4.26MB
web                 v2                  f8034ac90e98        16 minutes ago      4.26MB
web                 v1                  9c0f40999b88        20 minutes ago      4.26MB
busybox             latest              3f57d9401f8d        6 weeks ago         4.26MB

10.3 传统方式为Ubuntu添加SSH服务

10.3.1 创建Ubuntu容器

[root@node1 docker]# docker pull ubuntu:18.04
[root@node1 docker]# docker run -it --name ubuntu_v1 ubuntu:18.04 bash
root@87c32e96b1b8:/# ps -ef | grep 22
root          11       1  0 13:26 pts/0    00:00:00 grep --color=auto 22

10.3.2 配置软件源

root@87c32e96b1b8:/# cat >> /etc/apt/sources.list.d/aliyun.list << EOF
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
EOF
root@87c32e96b1b8:/# apt update

10.3.3 安装SSH服务

root@87c32e96b1b8:/# apt install openssh-server -y
root@87c32e96b1b8:/# mkdir /var/run/sshd
root@87c32e96b1b8:/# /usr/sbin/sshd -D &
[1] 4504
root@87c32e96b1b8:/# ps -ef | grep ssh
root        4504       1  0 13:46 pts/0    00:00:00 /usr/sbin/sshd -D
root        4506       1  0 13:46 pts/0    00:00:00 grep --color=auto ssh

10.3.4 取消pam登录限制

root@87c32e96b1b8:/# sed -i 's/session    required     pam_loginuid.so/# &/' /etc/pam.d/sshd
​
#在宿主机
[root@node1 ~]# mkdir .ssh
[root@node1 ~]# cd .ssh/
[root@node1 .ssh]# ssh-keygen -q 
[root@node1 .ssh]# cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCx9vF156BNrPhcfbFGLqM6CXewzKdyoB/rMZ3A8onwDZpAna8L5a3dYWXVkKBmeoIY+aomtHni6WB+hcagVM0AtLnIeUJEoC79QjQ8rHAhRovyTDWHnvIy96nm7+chFQk1QvilLuNQDhl+DvCPH3SOJIyJAXFn2lVrCOzS05LUYu/hAjlVCjKYuu73buXvkgj8C1YCDSWuwgAtEvWb9fp6UuEDB4SLThgqcN1aiKQxOYK+Zq+4f3GtD1yQy3KKoXkN5walMDG3nwBXDgqQTTd3PFDzbpr+UvIznZQD66Z/DZk0slCd2GwoS/twBzP3zgg80xWR809SkdVLDlUi8aECQNw9SGSb1ZgVKmEyat1eFzvoObwETn56ZOJlLfPj8gi/6amHbuz9rPZXPvTEQ8YzbY/UGFBiNRzwN+dX/tWkf2F74bVN5dJfxhZ/6cJzS5v0NQruVE56S7jNk4H68Q48lHN0RaBW2RFmuB8b03siSEM21DS9jxrfObvCd7Z86+M= root@node1
​
#在容器
root@87c32e96b1b8:/# echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCx9vF156BNrPhcfbFGLqM6CXewzKdyoB/rMZ3A8onwDZpAna8L5a3dYWXVkKBmeoIY+aomtHni6WB+hcagVM0AtLnIeUJEoC79QjQ8rHAhRovyTDWHnvIy96nm7+chFQk1QvilLuNQDhl+DvCPH3SOJIyJAXFn2lVrCOzS05LUYu/hAjlVCjKYuu73buXvkgj8C1YCDSWuwgAtEvWb9fp6UuEDB4SLThgqcN1aiKQxOYK+Zq+4f3GtD1yQy3KKoXkN5walMDG3nwBXDgqQTTd3PFDzbpr+UvIznZQD66Z/DZk0slCd2GwoS/twBzP3zgg80xWR809SkdVLDlUi8aECQNw9SGSb1ZgVKmEyat1eFzvoObwETn56ZOJlLfPj8gi/6amHbuz9rPZXPvTEQ8YzbY/UGFBiNRzwN+dX/tWkf2F74bVN5dJfxhZ/6cJzS5v0NQruVE56S7jNk4H68Q48lHN0RaBW2RFmuB8b03siSEM21DS9jxrfObvCd7Z86+M= root@node1" > /root/.ssh/authorized_keys
root@87c32e96b1b8:/# cat >> /run.sh << EOF  #写一个启动脚本
> #!/bin/bash
> /usr/sbin/sshd -D
> EOF
root@87c32e96b1b8:/# chmod +x /run.sh  #一定要加执行权限

10.3.5 提交镜像

[root@node1 ~]# docker commit ubuntu_v1 sshd:ubuntu_v1
sha256:aaeddfeb4dfd56433c0d3e4940e4d58424a3a9dc3c621d167e634310b8b93945
[root@node1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sshd                ubuntu_v1           aaeddfeb4dfd        17 seconds ago      331MB
web_v3              latest              f8034ac90e98        About an hour ago   4.26MB
web                 v2                  f8034ac90e98        About an hour ago   4.26MB
web                 v1                  9c0f40999b88        About an hour ago   4.26MB
busybox             latest              3f57d9401f8d        6 weeks ago         4.26MB
ubuntu              18.04               f9a80a55f492        9 months ago        63.2MB

docker commit命令用于从容器的更改创建一个新的Docker镜像。这个新镜像包含基础镜像和一个包含容器内所做更改的新层。以下是docker commit命令的一些常用选项及其解释:

  • -a, --author:指定作者信息

  • -c, --change:应用Dockerfile指令到创建的镜像。

  • -m, --message:提交消息。

  • -p, --pause:在提交期间暂停容器(默认为true)。

10.3.6 运行容器

[root@node1 ~]# docker run -p 10222:22 -d --name ssh_ubuntu sshd:ubuntu_v1 /run.sh
12ee4fd66c91b8d6fe4eeaa40559d26dfb7087d70ed7b6eae952df499054ef86
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
12ee4fd66c91        sshd:ubuntu_v1      "/run.sh"           8 seconds ago       Up 7 seconds        0.0.0.0:10222->22/tcp   ssh_ubuntu

10.3.7 连接验证

[root@node1 ~]# ssh 192.168.110.31 -p 10222
The authenticity of host '[192.168.110.31]:10222 ([192.168.110.31]:10222)' can't be established.
ED25519 key fingerprint is SHA256:qxNVFdtqaQDgmWjIxL0CfrFkHi5Up0SqVELKttWVhME.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[192.168.110.31]:10222' (ED25519) to the list of known hosts.
Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 5.10.0-182.0.0.95.oe2203sp3.x86_64 x86_64)
​
 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
​
To restore this content, you can run the 'unminimize' command.
​
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
​
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
​
root@12ee4fd66c91:~#

10.4 使用Dockerfile为Ubuntu添加SSH服务

10.4.1 准备

[root@node1 ~]# mkdir /sshd_ubuntu   
[root@node1 ~]# cat /root/.ssh/id_rsa.pub > /sshd_ubuntu/authorized_keys  #配置公钥
[root@node1 ~]# vim /sshd_ubuntu/run.sh  #配置启动脚本
#!/bin/bash
/usr/sbin/sshd -D
​
[root@node1 ~]# vim /sshd_ubuntu/aliyun.list  #配置软件源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

10.4.2 编写Dockerfile

[root@node1 ~]# vim /sshd_ubuntu/Dockerfile
FROM ubuntu:18.04
MAINTAINER kxy<kxy@163.com>
COPY aliyun.list /etc/apt/sources.list.d/aliyun.list
RUN apt update && \
    apt install -y openssh-server && \
    mkdir /var/run/sshd && \
    sed -i 's/session    required     pam_loginuid.so/# &/' /etc/pam.d/sshd && \
    mkdir /root/.ssh
COPY authorized_keys /root/.ssh/
COPY run.sh /run.sh
RUN chmod 755 /run.sh
​
EXPOSE 22
CMD ["/run.sh"]

文件详解:

  • FROM ubuntu:18.04:指定了基础镜像为ubuntu:18.04

  • MAINTAINER kxykxy@163.com:指定了镜像的维护者信息,这里是kxy,邮箱是kxy@163.com

  • COPY aliyun.list /etc/apt/sources.list.d/aliyun.list:将构建上下文中的aliyun.list文件复制到镜像的/etc/apt/sources.list.d/aliyun.list路径下。这个文件可能包含了Aliyun的软件源列表,以便从Aliyun的软件源安装软件包。

  • RUN apt update && apt install -y openssh-server && mkdir /var/run/sshd && sed -i 's/session required pam_loginuid.so/# &/' /etc/pam.d/sshd && mkdir /root/.ssh:首先,更新软件包列表;然后,安装openssh-server软件包;接着,创建/var/run/sshd目录;然后,使用sed命令注释掉/etc/pam.d/sshd文件中的session required pam_loginuid.so行;最后,创建/root/.ssh目录。这些步骤是为了在镜像中安装SSH服务器,并做一些初始化配置。

  • COPY authorized_keys /root/.ssh/:将构建上下文中的authorized_keys文件复制到镜像的/root/.ssh/目录下。这个文件通常包含了允许SSH访问的公钥。

  • COPY run.sh /run.sh:将构建上下文中的run.sh脚本复制到镜像的/目录下。这个脚本可能包含了在容器启动时需要执行的命令。

  • RUN chmod 755 /run.sh:为/run.sh脚本设置执行权限。

  • EXPOSE 22:声明容器监听的网络端口为22。这告诉Docker容器内的SSH服务将在22端口上监听网络连接。

  • CMD ["/run.sh"]:指定了容器启动时默认执行的命令。这里的命令是执行/run.sh脚本。

10.4.3 构建镜像

[root@node1 ~]# docker build -t sshd:ubuntu_v2 /sshd_ubuntu/
[root@node1 ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sshd                ubuntu_v2           e7facb901f8e        12 minutes ago      295MB
sshd                ubuntu_v1           e119f2914a25        About an hour ago   331MB
web                 v2                  f8034ac90e98        2 hours ago         4.26MB
web_v3              latest              f8034ac90e98        2 hours ago         4.26MB
web                 v1                  9c0f40999b88        2 hours ago         4.26MB
busybox             latest              3f57d9401f8d        6 weeks ago         4.26MB
ubuntu              18.04               f9a80a55f492        9 months ago        63.2MB

10.4.4 运行并测试

1、运行
[root@node1 ~]# docker run -d --name ssh_ubuntu_v2 -p 23:22 sshd:ubuntu_v2 
c69fe6ee91cf97db7a9307c84fd35361e5618022b6bc45f1b3626ef5aea4e2fd
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
c69fe6ee91cf        sshd:ubuntu_v2      "/run.sh"           5 seconds ago       Up 4 seconds        0.0.0.0:23->22/tcp   ssh_ubuntu_v2
[root@node1 ~]# docker port ssh_ubuntu_v2 
22/tcp -> 0.0.0.0:23
​
2、测试
[root@node1 ~]# ssh 192.168.110.31 -p 23
The authenticity of host '[192.168.110.31]:23 ([192.168.110.31]:23)' can't be established.
ED25519 key fingerprint is SHA256:YSqP5SxKL2HMMNv81kWcIQuU00/dRDZ+7RtfEgsv90s.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[192.168.110.31]:23' (ED25519) to the list of known hosts.
Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 5.10.0-182.0.0.95.oe2203sp3.x86_64 x86_64)
​
 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
​
To restore this content, you can run the 'unminimize' command.
​
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
​
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
​
root@c69fe6ee91cf:~# 

10.5 Dockerfile实战

10.5.1 试题

  • 编写Dockerfile制作Web应用系统nginx镜像,生成镜像名为nginx:v1.1,并推送其到私有仓库。具体要求如下:

    • 基于openeuler基础镜像;

    • 指定作者为Kxy;

    • 安装nginx服务,将提供的dest目录传到镜像内,并将dest目录内的前端文件复制到nginx的工作目录;

    • 暴露80端口;

    • 设置服务自启动。

10.5.2 编写Dockerfile

[root@node1 ~]# mkdir /nginx
[root@node1 ~]# echo nginx test page > /nginx/index.html   #测试页
[root@node1 ~]# vim /nginx/Dockerfile
FROM openeuler/openeuler
MAINTAINER kxy
​
RUN yum install nginx -y
COPY index.html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

10.5.3 构建镜像

[root@node1 nginx]# docker build -t nginx:v1.1 /nginx/
[root@node1 ~]# docker images 
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
nginx                 v1.1      c079eb3c68bf   22 seconds ago   438MB
openeuler/openeuler   latest    379784e9b42d   36 hours ago     189MB

10.5.4 测试

[root@node1 ~]# docker run -itd -p 88:80 --name webtest nginx:v1.1 
[root@node1 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                               NAMES
dbd598bfeb2a   nginx:v1.1   "nginx -g 'daemon of…"   8 seconds ago   Up 7 seconds   0.0.0.0:88->80/tcp, :::88->80/tcp   webtest

10.5.5 向私有仓库推送镜像

[root@node1 ~]# docker login --username=alykxy1511327912 registry.cn-chengdu.aliyuncs.com  #登录
[root@node1 ~]# docker tag c079eb3c68bf registry.cn-chengdu.aliyuncs.com/xiangyukong/kxy:nginx #打包
[root@node1 ~]# docker push registry.cn-chengdu.aliyuncs.com/xiangyukong/kxy:nginx   #推送

  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值