【运维知识大神篇】运维人必学的Docker教程2(容器管理命令详解+数据持久化+端口映射底层原理+手动制作容器镜像+一个容器运行多个服务)

发布时间:2023年12月27日

本篇文章继续给大家介绍Docker,主要介绍容器管理的内容,包括容器管理命令,数据持久化,端口映射底层原理,手动制作容器镜像及一个容器运行多个服务的实战。

目录

容器管理命令

一、基础命令回顾

1、docker部署

2、镜像管理

3、容器管理

二、基础命令补充

1、容器信息查看

2、日志查看

3、容器停止、开启与重启

4、容器暂停与恢复

5、容器文件拷贝

6、查看容器状态

7、查看容器进程

8、杀死容器

9、修改容器名称

数据持久化

一、基础命令

二、多个容器使用一个挂载点的使用场景

端口映射底层

一、原理

二、常见写法

手动制作容器镜像

一、制作流程

二、实战1:手动制作镜像实现本地yum仓库,要求可以在本地yum仓库部署docker

三、实战2:一个容器运行多个服务案例,给yum仓库镜像添加sshd的功能


容器管理命令

一、基础命令回顾

1、docker部署

docker部署一般使用包管理工具(yum、apt)还有在任何Linux系统都通用的二进制部署

2、镜像管理

docker image pull | docker pull
docker image save | docker save
docker image load | docker load
docker image tag | docker tag
docker image rm | docker rmi
docker image ls | docker images
docker image build | docker build
docker image push | docker push
docker image history | docker history 

3、容器管理

docker container ls/ps/list | docker ps
docker container run | docker run
-i        分配一个交互式的标准输入
-t        分配终端
-d        后台运行
-e        向容器传递环境变量
--name    指定容器的名称
-p        指定端口映射
docker container exec | docker exec
docker container rm | docker rm
docker container inspect

有些镜像在运行的时候需要传递特定的参数

参考链接:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docker.html

#部署单点ES,指定"discovery.type=single-node"表示ES为单点
docker run -p 9200:9200 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.5    

#部署mysql,MYSQL_ROOT_PASSWORD表示指定root用户,密码为123
docker run -e MYSQL_ROOT_PASSWORD=123 -d  --name=db01 mysql:8.0

#部署mysql,MYSQL_ALLOW_EMPTY_PASSWORD=yes表示root用户,密码为空
docker run -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d --name=db02 mysql:8.0

#部署mysql,MYSQL_RANDOM_ROOT_PASSWORD=yes表示配置mysql的root用户,密码随机
docker run -e MYSQL_RANDOM_ROOT_PASSWORD=yes -d  --name=db03 mysql:8.0

二、基础命令补充

1、容器信息查看

查看nginx对外提供服务的IP,后面跟容器名称

[root@Docker01 ~]# docker run -d nginx:1.14.2
[root@Docker01 ~]#  docker container inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' hungry_jemison
172.17.0.2

遍历的方式查找IP

[root@Docker01 ~]# docker container inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' hungry_jemison
172.17.0.2

遍历方式查看Mac地址

[root@Docker01 ~]# docker container inspect -f '{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' hungry_jemison
02:42:ac:11:00:02

查看最近的一个容器对外提供的IP

[root@Docker01 ~]# docker container inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" `docker container ps -lq`
172.17.0.2

2、日志查看

--since查看两分钟以内的数据,--until查看两分钟以后的容器的日志,后面可以跟名字也可以跟容器ID

[root@Docker01 ~]# curl 172.17.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
......

[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
a82a20da88e7   nginx:1.14.2   "nginx -g 'daemon of…"   6 minutes ago   Up 6 minutes   80/tcp    clever_sammet
[root@Docker01 ~]# docker container logs -f -t --since 2m a82a20da88e7
2023-06-07T13:10:22.183407269Z 172.17.0.1 - - [07/Jun/2023:13:10:22 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
[root@Docker01 ~]# docker container logs -f -t --until 2m clever_sammet
2023-06-07T13:10:22.183407269Z 172.17.0.1 - - [07/Jun/2023:13:10:22 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

3、容器停止、开启与重启

容器停止后将不再对外提供服务,开启后又重新提供,比如我们运行nginx,修改了配置文件,在nginx的容器中不方便重启服务,我们就可以重启nginx容器也可以实现启用配置文件的效果,当然也可以nginx -s reload

[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
a82a20da88e7   nginx:1.14.2   "nginx -g 'daemon of…"   7 minutes ago   Up 7 minutes   80/tcp    clever_sammet
[root@Docker01 ~]# docker stop clever_sammet    #停止,默认10秒停,可以用stop -t 1,1秒停止
clever_sammet
[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@Docker01 ~]# docker start clever_sammet    #开启
clever_sammet
[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS        PORTS     NAMES
a82a20da88e7   nginx:1.14.2   "nginx -g 'daemon of…"   8 minutes ago   Up 1 second   80/tcp    clever_samme
[root@Docker01 ~]# docker restart clever_sammet    #重启
clever_sammet

4、容器暂停与恢复

容器暂停,相当于虚拟机的挂起

[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS              PORTS     NAMES
a82a20da88e7   nginx:1.14.2   "nginx -g 'daemon of…"   9 minutes ago   Up About a minute   80/tcp    clever_sammet
[root@Docker01 ~]# docker pause clever_sammet    #容器暂停
clever_sammet
[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                       PORTS     NAMES
a82a20da88e7   nginx:1.14.2   "nginx -g 'daemon of…"   9 minutes ago   Up About a minute (Paused)   80/tcp    clever_sammet
[root@Docker01 ~]# docker unpause clever_sammet    #容器恢复
clever_sammet
[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS         PORTS     NAMES
a82a20da88e7   nginx:1.14.2   "nginx -g 'daemon of…"   10 minutes ago   Up 2 minutes   80/tcp    clever_sammet

5、容器文件拷贝

将宿主机的koten目录拷贝到clever_sammet容器的根路径下

[root@Docker01 ~]# mkdir koten
[root@Docker01 ~]# docker cp koten clever_sammet:/   
Successfully copied 1.54kB to clever_sammet:/
[root@Docker01 ~]# docker exec -it clever_sammet bash
root@a82a20da88e7:/# cd /koten/
root@a82a20da88e7:/koten# exit
exit

将宿主机的/etc/hosts文件拷贝到clever_sammet容器的根路径下

[root@Docker01 ~]# docker cp /etc/hosts clever_sammet:/
Successfully copied 2.05kB to clever_sammet:/
[root@Docker01 ~]# docker exec -it clever_sammet cat /hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

将clever_sammet容器的/6.txt拷贝到宿主机

[root@Docker01 ~]# docker exec -it clever_sammet bash
root@a82a20da88e7:/# echo 666 > 6.txt
root@a82a20da88e7:/# exit
exit
[root@Docker01 ~]# docker cp clever_sammet:/6.txt ./
Successfully copied 2.05kB to /root/./
[root@Docker01 ~]# cat 6.txt 
666

6、查看容器状态

docker stats clever_sammet是持续输出状态,类似于实时监控,--no-stream只输出一个状态信息

[root@Docker01 ~]# docker stats clever_sammet --no-stream
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT    MEM %     NET I/O     BLOCK I/O   PIDS
a82a20da88e7   clever_sammet   0.00%     1.355MiB / 3.84GiB   0.03%     656B / 0B   0B / 0B     2

7、查看容器进程

查看容器有哪些进程

[root@Docker01 ~]# docker top clever_sammet
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                100531              100511              0                   21:17               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 100552              100531              0                   21:17               ?                   00:00:00            nginx: worker process

8、杀死容器

[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
a82a20da88e7   nginx:1.14.2   "nginx -g 'daemon of…"   23 minutes ago   Up 15 minutes   80/tcp    clever_sammet
[root@Docker01 ~]# docker kill clever_sammet
clever_sammet
[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@Docker01 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                        PORTS     NAMES
a82a20da88e7   nginx:1.14.2   "nginx -g 'daemon of…"   24 minutes ago   Exited (137) 12 seconds ago             clever_sammet

9、修改容器名称

[root@Docker01 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                        PORTS     NAMES
a82a20da88e7   nginx:1.14.2   "nginx -g 'daemon of…"   25 minutes ago   Exited (137) 56 seconds ago             clever_sammet
[root@Docker01 ~]# docker rename clever_sammet nginx
[root@Docker01 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                            PORTS     NAMES
a82a20da88e7   nginx:1.14.2   "nginx -g 'daemon of…"   25 minutes ago   Exited (137) About a minute ago             nginx

数据持久化

一、基础命令

1、查看现有存储卷

[root@Docker01 ~]# docker volume ls
DRIVER    VOLUME NAME

2、创建随机(匿名)的存储卷

[root@Docker01 ~]# docker volume create
cecbc406a5cea75be4618daacfca486cf42718103f455eabbe631801a00fc3b4

3、创建自定义名称的存储卷

[root@Docker01 ~]# docker volume create linux
linux

4、清除未使用的存储卷

应该是清除所有未使用的存储卷,但是我测试docker24.0.2版本只能删除随机的未使用的存储卷,自定义名字的存储卷无法被删除,20.10.24版本会都删除

[root@Docker01 ~]# docker volume create
4b98c692381d1660ee85ad132edf6f8bdb1595c3a4e6d4d0139ed42d91035270
[root@Docker01 ~]# docker volume create koten
koten
[root@Docker01 ~]# docker volume prune -f
Deleted Volumes:
4b98c692381d1660ee85ad132edf6f8bdb1595c3a4e6d4d0139ed42d91035270

Total reclaimed space: 0B
[root@Docker01 ~]# docker volume ls
DRIVER    VOLUME NAME
local     koten

5、删除指定的存储卷

[root@Docker01 ~]# docker volume ls
DRIVER    VOLUME NAME
local     koten
[root@Docker01 ~]# docker volume rm koten
koten
[root@Docker01 ~]# docker volume ls
DRIVER    VOLUME NAME

6、查看存储卷的详细信息

[root@Docker01 ~]# docker volume create koten
koten
[root@Docker01 ~]# docker volume inspect koten
[
    {
        "CreatedAt": "2023-06-07T21:44:11+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/koten/_data",  #存储卷在宿主主机的目录
        "Name": "koten",
        "Options": null,
        "Scope": "local"
    }
]

7、容器使用存储卷进行数据持久化

将存储卷koten挂载到容器,若不存在则直接创建,默认权限为rw,此时修改容器的nginx主页,当容器停止再重启的时候,数据也不会消失,主机要被绑定在挂载点上的目录是/var/lib/docker/volumes/koten/_data,数据都存储在了存储卷里,同时也存储在了这个目录下,两边任意一边修改,另一边都会发生变化

[root@Docker01 ~]# docker container run -v koten:/usr/share/nginx/html -d --name web01 nginx:1.14.2
2ceb94d0b90764a640e1cac942d811b8a9e94237da114261b67b098b6e736109

#该命令等同于docker container run -v koten:/usr/share/nginx/html:rw -d --name web01 nginx:1.14.2
#默认就是rw权限

将koten存储卷以只读的方式挂载,此时进入web02的容器中,无法修改挂载点的文件

[root@Docker01 ~]# docker container run -v koten:/usr/share/nginx/html:ro -d --name web02 nginx:1.14.2
1df2dd3e26854ccc2cb8b95fbdcb2a144d791cec303836a1594bcfbe03cb7ad2

不指定存储卷,将容器的/usr/share/nginx/html路径作为挂载点,和本地随机的存储卷关联

[root@Docker01 ~]# docker container run -v /usr/share/nginx/html -d --name web03 nginx:1.14.2
a707dc435e79a6a4cbc6c9e7e9fb0dc8c374a9f362272b1ff33f9bf2e73c6dbe
[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
a707dc435e79   nginx:1.14.2   "nginx -g 'daemon of…"   6 seconds ago   Up 5 seconds   80/tcp    web03
1df2dd3e2685   nginx:1.14.2   "nginx -g 'daemon of…"   4 minutes ago   Up 4 minutes   80/tcp    web02
2ceb94d0b907   nginx:1.14.2   "nginx -g 'daemon of…"   9 minutes ago   Up 9 minutes   80/tcp    web01
[root@Docker01 ~]# docker volume ls
DRIVER    VOLUME NAME
local     f92dfafb134cdb5652c56b2723fbfddf1eefaabed0cd7b6b8a3815873386cb14
local     koten

8、创建宿主机路径存储卷

删除所有的存储卷,可以将未使用的所有存储卷删除

docker volume rm `docker volume ls -q` 

删除所有的容器及匿名存储卷,-v有删除匿名存储卷的作用,还有使用过的存储卷,我们可以指定名字删除?

[root@Docker01 ~]# docker container rm -fv `docker container ps -qa`
a707dc435e79
1df2dd3e2685
2ceb94d0b907
a82a20da88e7
7f3b67fade82
343ab6c3c4bc
[root@Docker01 ~]# docker volume ls
DRIVER    VOLUME NAME
local     koten
[root@Docker01 ~]# docker volume rm koten
koten
[root@Docker01 ~]# docker volume ls
DRIVER    VOLUME NAME

此时如果不想被删除可以使用宿主机的路径作为存储卷

将宿主机的路径以只读方式挂载到容器的挂载点,如果宿主机的路径不存在会自动创建

[root@Docker01 ~]# docker run -d -v /koten/data:/usr/share/nginx/html:ro --name web01 nginx:1.20.1 
3f4a568696f3f96a33c18ed9cc87633eca2b89100b77c6235994a978b1d867c7

此时查存储卷查不出来,但是可以查看存储卷的详细信息,可以通过挂载的目录找到删除,所以遇见懂行的还是不行

[root@Docker01 ~]# docker volume ls
DRIVER    VOLUME NAME
[root@Docker01 ~]# docker inspect web01
......
"Mounts": [
            {
                "Type": "bind",
                "Source": "/koten/data",
                "Destination": "/usr/share/nginx/html",
                "Mode": "ro",
                "RW": false,
                "Propagation": "rprivate"
            }
        ],
......
[root@Docker01 ~]# rm -rf /koten/data/

9、与其他容器使用相同的存储卷

由于web01存储卷使用的是路径,所以web02也通过docker volume ls查不到,也是用的/koten/data的路径存储卷

[root@Docker01 ~]# docker container run --volumes-from web01 -d --name web02 nginx:1.20.1
ea3c1bfe997f12487912e526a43c6356a44d714820a0ed054384aea2a723d6bd
[root@Docker01 ~]# docker volume ls
DRIVER    VOLUME NAME
[root@Docker01 ~]# docker inspect web02
......
"Mounts": [
            {
                "Type": "bind",
                "Source": "/koten/data",
                "Destination": "/usr/share/nginx/html",
                "Mode": "",
                "RW": false,
                "Propagation": "rprivate"
            }
        ],
......

二、多个容器使用一个挂载点的使用场景

1、共享文件:多个容器需要访问相同的文件。例如,多个 Web 应用容器需要访问相同的静态文件夹。
2、数据库集群:多个数据库容器需要在同一目录下共享数据卷。例如,MySQL 数据库容器需要写入和读取共享的数据卷。
3、日志收集:多个容器需要将日志输出到同一目录。例如,多个应用程序容器需要将日志写入共享的目录中,以便可以统一处理和分析日志数据。

需要注意的是,在使用多个容器共享同一个挂载点时,必须确保所有容器都是只读的或只写的,并且它们不应该同时写入同一个文件或目录,否则可能会导致文件损坏或数据冲突。另外,为了避免权限问题,请确保所有容器都使用相同的用户和组(UID / GID)

端口映射底层

一、原理

端口映射其实是做了两件事,一件是编写iptables规则,另一件是监听了映射的端口

二、常见写法

1、将宿主机的所有IP地址的81端口映射到容器的80端口,默认使用tcp协议

[root@Docker01 ~]# docker run -d -p 81:80 --name web01 nginx:1.20.1
edc0949c0d75dc0d9c9d4ab2fc920b04e400c71655c9565420f95088b003faaf

2、指定IP地址进行端口映射

[root@Docker01 ~]# docker run -d -p 10.0.0.201:82:80 --name web02 nginx:1.20.1
326a04c6c7e5048c529d7bc9239df3429649f77835077e3233d886829b71c1e4

3、指定端口范围进行映射

[root@Docker01 ~]# docker run -d -p 10.0.0.201:20-21:20-21 --name web03 nginx:1.20.1
3c2e7cec434b8af8d838feee9d525c1a1119ed8ec58d904c87f68e2497f028fe

4、指定多个不连续的端口映射

比如在部署ES容器的时候就会用到

[root@Docker01 ~]# docker run -d -p 10.0.0.201:9200:9200 -p 10.0.0.201:9300:9300 --name web04 nginx:1.20.1 
f18bc1b8ff90f491d2ae6cbb6e13fb8b242a6a9e96cdd3e90b8e10ed86421553

5、指定协议,若不指定协议,默认是tcp协议

[root@Docker01 ~]# docker run -d -p 10.0.0.201:53:53/udp -p 10.0.0.201:53:53/tcp --name web05 nginx:1.20.153c62e049428b7e22634424bc45514c3dde16d2b82e8e33d22701686e7fa17dc

6、宿主机随机端口对容器80端口进行映射

[root@Docker01 ~]# docker run -d -p 10.0.0.201::80/tcp --name web06 nginx:1.20.1
07f354785edf8fc632e9c6aceb146d01db1a9a76405b39bacc854dd937566bf4

7、宿主机用随机端口对容器暴露的端口进行映射

[root@Docker01 ~]# docker run -d -P --name web07 nginx:1.20.1
f2373e6f934c68a1394c2baf82e06d5ca10623deaf5ad4ad1d7ab8c0097321c8
[root@Docker01 ~]# docker container ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS                                                          NAMES
f2373e6f934c   nginx:1.20.1   "/docker-entrypoint.…"   16 seconds ago       Up 15 seconds       0.0.0.0:32769->80/tcp, :::32768->80/tcp   

手动制作容器镜像

一、制作流程

1、启动容器

启动容器并保持容器为一致开启状态,俗话说就是让容器一直夯着

tail -f只有夯住的作用,nginx -g既有夯住的作用,又有启动nginx服务的作用,若是把nginx -g写进脚本,扩展性就更强了

[root@Docker01 ~]# docker run --name base -d centos:7 tail -f /etc/hosts

2、安装服务

[root@Docker01 ~]# docker exec -it base bash
[root@8d7bdcdf1096 /]# curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@8d7bdcdf1096 /]# curl -s -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@8d7bdcdf1096 /]# yum -y install nginx
......
[root@8d7bdcdf1096 /]# ls /usr/share/nginx/html/    
404.html        icons/          nginx-logo.png
50x.html        img             poweredby.png
en-US           index.html      
[root@8d7bdcdf1096 /]# rm -rf /usr/share/nginx/html/*[root@8d7bdcdf1096 /]# echo www.koten.vip > /usr/share/nginx/html/index.html 
[root@8d7bdcdf1096 /]# nginx -g 'daemon off;'
[root@8d7bdcdf1096 /]# exit
exit
[root@Docker01 ~]# 

3、将容器提交为镜像

[root@Docker01 ~]# docker container commit -a koten -m 'koten-nginx' base koten-centos-nginx:v0.1
sha256:d98fa4dc0aa3a2a41cafdbf47d8585ce593542196eea4ccf76bd10dce2a68ecc

4、查看镜像的详细信息

[root@Docker01 ~]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED          SIZE
koten-centos-nginx   v0.1      d98fa4dc0aa3   25 seconds ago   486MB
[root@Docker01 ~]# docker inspect koten-centos-nginx:v0.1
......
        "RepoTags": [
            "koten-centos-nginx:v0.1"
        ],
......
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "tail",
                "-f",
                "/etc/hosts"
            ],
            "Image": "centos:7",
......
[root@Docker01 ~]# 

5、手动运行镜像测试

#运行镜像
[root@Docker01 ~]# docker run -d --name myweb01 koten-centos-nginx:v0.1
e05e4e8e490e7d3af8a92eb7d71fd4fe8b096a48904b611fcc6a93f6e0fcfe91
[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE                     COMMAND                CREATED          STATUS          PORTS     NAMES
e05e4e8e490e   koten-centos-nginx:v0.1   "tail -f /etc/hosts"   15 seconds ago   Up 15 seconds             myweb01

#运行镜像并在容器中执行将nginx在前台服务的命令
[root@Docker01 ~]# docker run -d --name myweb02 koten-centos-nginx:v0.1 nginx -g 'daemon off;'
71c2add6ae7137029466a7d1d52c11873f54c2fe8f64f5cc5d7b7404465efa91
[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED              STATUS          PORTS     NAMES
71c2add6ae71   koten-centos-nginx:v0.1   "nginx -g 'daemon of…"   18 seconds ago       Up 17 seconds             myweb02
e05e4e8e490e   koten-centos-nginx:v0.1   "tail -f /etc/hosts"     About a minute ago   Up 59 seconds             myweb01

#可以将容器再次打包成镜像
[root@Docker01 ~]# docker container commit myweb02 koten-centos-nginx:v0.2
sha256:1867b7ccba272395ed92d35a3f0f913b89562a8efc17bd0395dae28fd54e4ec5
[root@Docker01 ~]# docker run -d  --name myweb03 koten-centos-nginx:v0.2
a9a5813fe3ea5fcccb55d9b3d340be9dce2d15da3e5cbc505c14e5054be05560
[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED              STATUS              PORTS     NAMES
a9a5813fe3ea   koten-centos-nginx:v0.2   "nginx -g 'daemon of…"   25 seconds ago       Up 24 seconds                 myweb03
71c2add6ae71   koten-centos-nginx:v0.1   "nginx -g 'daemon of…"   About a minute ago   Up About a minute             myweb02
e05e4e8e490e   koten-centos-nginx:v0.1   "tail -f /etc/hosts"     2 minutes ago        Up 2 minutes                  myweb01

#测试nginx容器的主页内容
[root@Docker01 ~]# docker container inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" `docker container ps -lq`
172.17.0.4
[root@Docker01 ~]# curl 172.17.0.4
www.koten.vip

二、实战1:手动制作镜像实现本地yum仓库,要求可以在本地yum仓库部署docker

1、启用容器服务

[root@Docker01 ~]# docker run --name docker-base -d centos:7 tail -f /etc/hosts
26d354802f586db09074c6b173a50387d7a45f1fcc5e9e659e610b7217485cc6
[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND                CREATED         STATUS         PORTS     NAMES
26d354802f58   centos:7   "tail -f /etc/hosts"   6 minutes ago   Up 6 minutes             docker-base

2、复制rpm包和yum仓库部署脚本到容器中

[root@Docker01 ~]# docker cp deploy_docker.sh docker-base:/
Successfully copied 2.56kB to docker-base:/
[root@Docker01 ~]# docker cp /Packages docker-base:/
Successfully copied 5.41GB to docker-base:/

3、运行脚本实现自动部署yum仓库

[root@Docker01 ~]# docker exec -it docker-base bash
[root@26d354802f58 /]# sh /deploy_docker.sh 
......
Complete!
Spawning worker 0 with 130 pkgs
Spawning worker 1 with 129 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
Failed to get D-Bus connection: Operation not permitted
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service, pointing to /usr/lib/systemd/system/nginx.service.

4、编写个nginx -g脚本,运行容器的时候执行脚本即启动了服务

想不被夯住启动nginx,直接写nginx即可,可以在systemctl cat nginx查看nginx启动命令

[root@26d354802f58 /]# cat start.sh
#!/bin/bash

nginx -g 'daemon off;'

5、提交镜像并启动yum容器

[root@Docker01 ~]# docker container commit docker-base docker-local-yum:v0.1
[root@Docker01 ~]# docker run -dp 80:80 docker-local-yum:v0.1 bash -x start.sh
dbbdd20dba951f0278edf84b832fadcd54086d756d5602ae15f7c96146569757

6、客户端配置yum源

[root@Docker04 ~]# cat /etc/yum.repos.d/local-docker.repo
[local]
name=docker_local
baseurl=http://10.0.0.201/packages
enabled=1

7、客户端安装测试

[root@Docker04 ~]# yum -y install docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io 
......
========================================================================================================
 Package                             Arch             Version                     Repository       Size
========================================================================================================
Installing:
 containerd.io                       x86_64           1.6.21-3.1.el7              local            34 M
 docker-ce                           x86_64           3:20.10.24-3.el7            local            22 M
 docker-ce-cli                       x86_64           1:20.10.24-3.el7            local            30 M
Installing for dependencies:
 docker-ce-rootless-extras           x86_64           24.0.2-1.el7                local           9.1 M

Transaction Summary
========================================================================================================
......

三、实战2:一个容器运行多个服务案例,给yum仓库镜像添加sshd的功能

1、基于上面的yum镜像为基础镜像

[root@Docker01 ~]# docker run -d docker-local-yum:v0.1    #运行容器
9c758bf1a0564c70984c58eb677a301a4d16a935903a73530134d848e773fb7f
[root@Docker01 ~]# docker ps    #查看当前正在运行的容器
CONTAINER ID   IMAGE                   COMMAND                CREATED         STATUS         PORTS     NAMES
9c758bf1a056   docker-local-yum:v0.1   "tail -f /etc/hosts"   9 seconds ago   Up 8 seconds             elegant_gauss
[root@Docker01 ~]# docker exec -it elegant_gauss bash    #进入容器
[root@9c758bf1a056 /]# yum provides sshd    #查找sshd服务在哪个安装包下
......
openssh-server-7.4p1-22.el7_9.x86_64 : An open source
     ...: SSH server daemon
Repo        : updates
Matched from:
Filename    : /usr/sbin/sshd
[root@9c758bf1a056 /]# yum -y install openssh-server initscripts
......
[root@9c758bf1a056 /]# cat /start.sh
#!/bin/bash

# Inint root password.
if [ -n "$ADMIN_PASSWD" ];then
   echo $ADMIN_PASSWD | passwd root --stdin
elif [ -n "$1" ]; then
   echo $1 | passwd root --stdin
else 
  echo 123 | passwd root --stdin
fi

# start nginx server
# nginx -g "daemon off;"
nginx

# get key
/usr/sbin/sshd-keygen

# start sshd service
/usr/sbin/sshd -D
[root@9c758bf1a056 /]# exit
exit
[root@Docker01 ~]# 

#initscripts是CentOS 或者 RHEL 系统的初始化脚本包,用于启动或停止系统服务、设置主机名等
不安装这个会影响ssh的使用

2、提交镜像并启动yum容器

[root@Docker01 ~]# docker commit elegant_gauss docker-local-yum:v0.2
sha256:abb8580cd9959fbb92b71bc51f68f00445ec59edaefd7165b9d2e09c80565ae5
[root@Docker01 ~]# docker run -dp 1180:80 -p 1122:22 docker-local-yum:v0.2 bash -x /start.sh 666
6df7b592ce07bedf0090a19255483e300700a29c9ddb1b6e24e22a05651f721c
[root@Docker01 ~]# docker container inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" `docker container ps -lq`
172.17.0.2
[root@Docker01 ~]# ssh 172.17.0.2
......
[root@6df7b592ce07 ~]# exit
logout
Connection to 172.17.0.2 closed.
[root@Docker01 ~]# 

我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

文章来源:https://blog.csdn.net/qq_37510195/article/details/131089749
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。