Linux之Docker虚拟化技术(三)
一、基于容器制作新镜像
这里以nginx为例制作镜像,修改了容器,制作成nginx:v1版本.在多台服务器共享使用创建nginx
配置文件,环境准备
## 修改nginx.conf配置文件
[root@localhost docker]# sed -e '/#/d' -e '/^$/d' /etc/nginx/nginx.conf.default
worker_processes 1;
events {worker_connections 1024;
}
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
}## 拉取镜像
[root@localhost docker]# docker pull nginx:latest
latest: Pulling from library/nginx
b1badc6e5066: Pull complete
a2da0c0f2353: Pull complete
e5d9bb0b85cc: Pull complete
14a859b5ba24: Pull complete
716cdf61af59: Pull complete
14e422fd20a0: Pull complete
c3741b707ce6: Pull complete
Digest: sha256:33e0bbc7ca9ecf108140af6288c7c9d1ecc77548cbfd3952fd8466a75edefe57
Status: Downloaded newer image for nginx:latest## 查看镜像
[root@localhost docker]# docker images | grep nginx
nginx latest ad5708199ec7 2 weeks ago 192MB## 镜像配置拷贝
[root@localhost docker]# docker cp /etc/nginx/nginx.conf vm01:/etc/nginx/nginx.conf
[root@localhost docker]#
[root@localhost docker]#
[root@localhost docker]#
我先在将我新建的镜像做保存处理为我们的v1版本
[root@localhost docker]# docker commit 32e173542bdc nginx:v1
sha256:48b81f0350562f175b59df0ca8c2151b02dcf8c8b895bf8700dbab93cd1a7f19
查看创建的容器镜像版本信息
我们也可以将这个镜像打成一个tar包进行保存
[root@localhost docker]# docker save nginx:v1>nginx.tar
导入镜像方法
[root@localhost docker]# docker load -i nginx.tar
Loaded image: nginx:v1
[root@localhost docker]# docker rmi -f nginx:v1
Untagged: nginx:v1
Deleted: sha256:48b81f0350562f175b59df0ca8c2151b02dcf8c8b895bf8700dbab93cd1a7f19
Deleted: sha256:dc789bf4b6f3c77ab0582be92e4c56cf417750f9efce355a996f1658da90f488
使用export导出镜像(丢失内存中的文件,并且只能使用import导入)
使用import导入信息后tag名需要修改
使用docker启动镜像情况下,export 导出的镜像只能使用export导入,并且后台命令只能使用/bin/bash
## 查看docker镜像
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2 fe881f8d6ea8 26 minutes ago 191MB
nginx v1 48b81f035056 40 minutes ago 192MB
nginx latest ad5708199ec7 2 weeks ago 192MB
[root@localhost docker]### 后台启动容器
[root@localhost docker]# docker run -itd --name=vm02 nginx:v2 nginx -g "daemon off"
65b1da3703a0eafab1cc73cda69b0cbedeb9f2f434df1003de44a7962724ecbe
[root@localhost docker]#
[root@localhost docker]# ## 查看容器使用情况
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
32e173542bdc nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp vm01[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65b1da3703a0 nginx:v2 "nginx -g 'daemon of…" 31 seconds ago Exited (1) 30 seconds ago vm02
32e173542bdc nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp vm01## 启动docker镜像
[root@localhost docker]# docker run -itd --name=vm03 nginx:v2 /bin/bash
1d31a27d131ae70a0863bf563e75376e7168b9a1f6f8bd0b78d6b72387ec5373
[root@localhost docker]#
[root@localhost docker]#
[root@localhost docker]#
[root@localhost docker]# ## docker import -->import ->docker run + 命令
[root@localhost docker]#
[root@localhost docker]#
[root@localhost docker]#
[root@localhost docker]# docker ps -a
\CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1d31a27d131a nginx:v2 "/bin/bash" About a minute ago Up About a minute vm03
65b1da3703a0 nginx:v2 "nginx -g 'daemon of…" 2 minutes ago Exited (1) 2 minutes ago vm02
32e173542bdc nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp vm01
[root@localhost docker]#
[root@localhost docker]# docker exec -it vm03 /bin/bash
root@1d31a27d131a:/#
root@1d31a27d131a:/# /usr/sbin/nginx
查看nginx执行镜像层数
[root@localhost docker]# docker history nginx:latest
IMAGE CREATED CREATED BY SIZE COMMENT
ad5708199ec7 2 weeks ago CMD ["nginx" "-g" "daemon off;"] 0B buildkit.dockerfile.v0
<missing> 2 weeks ago STOPSIGNAL SIGQUIT 0B buildkit.dockerfile.v0
<missing> 2 weeks ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
[root@localhost ~]# docker run -itd --name=vm04 nginx:v2 nginx -g "daemon off;"
ec4345cdbfd3692401cbbd25e880945e8d984e0e01ecc0ac5f31f0a66ddfd340
容器启动一定要指定一个入口命令,保证容器是一个挂起的状态(存在一个进程程序)
查看容器的入口命令
[root@localhost ~]# docker run -itd --name=mysql01 -v /data/mysql:/var/lib/mysql/ -e MYSQL_ROOT_PASSSWORD=aaaAAA111. mysql:8.0.37
二、基于Dockerfile制作基础镜像服务
Dockerfile制作镜像是一个基于基础镜像,通过编写Dockerfile方式将功能进行叠加,去构建镜像,从而去创建容器
基于nginx构建nginx网站镜像
## 2025年9月1日18:45:41
## create nginx image
# by author 666
## 指定基础镜:
FROM nginx:latest## 指定工作目录
WORKDIR /root## 删除默认nginx配置文件
RUN rm -rf /etc/nginx/conf.d /etc/nginx/nginx.conf## 拷贝宿主机模版文件到nginx目录
COPY nginx.conf /etc/nginx/COPY index.html /usr/share/nginx/html## 指定cmd入口命令
CMD nginx -g "daemon off;"~
基于centos7镜像构建ssh远程
## 2025年9月1日18:45:41
## create nginx image
# by author 666
## 指定基础镜:
FROM centos7-ansible:latestMAINTAINER www.66.cnLABEL OS 2.0
## 指定工作目录
WORKDIR /root/## 删除repo源目录
RUN rm -rf /etc/yum.repos.d/*.repo## 拷贝阿里云源目录
COPY Centos7-al.repo /etc/yum.repos.d/## 安装openssh服务
RUN yum -y install openssh-server net-tools iproute## 设置root密码
RUN echo 1 | passwd --stdin root## 生成ssh秘钥文件
RUN sshkeygen -A
## 指定cmd入口命令
CMD nginx -g /usr/sbin/sshd -D## 设置entrypoint入口
ENTRYPOINT /usr/bin/init
三、Dockerfile制作镜像规范
- 精简镜像:尽量让镜像只有一个服务
- 制作的镜像源不易过大,尽量保持轻简
- 提供注释和维护者信息
- 减少镜像层数,可以将多条RUN指令用&&进行连接
- 合理调整镜像指定顺序,在开启缓存情况下,已经有缓存的文件放在前面,没有缓存的文件放在后面
- 减少外部源干扰