1. 手动制作docker镜像
(1)制作一个基于centos7系统的nginx镜像(单服务)
1. 启动一个基础容器
# 默认初始命令是/bin/bash,只要一退出容器,容器就会死
docker run -it -p 80:80 centos:7
2. 安装服务
# 安装yum源和epel源
[root@d78399ccd3e6 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@d78399ccd3e6 ~]# curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
# 安装nginx
[root@d78399ccd3e6 ~]# yum -y install nginx
# 因为容器里面没有D-Bus,所以使用不了systemctl
[root@d78399ccd3e6 ~]# systemctl start nginx
# 直接启动
[root@d78399ccd3e6 ~]# nginx
[root@d78399ccd3e6 ~]# vi /var/log/nginx/error.log
[root@d78399ccd3e6 ~]# rm -rf /usr/share/nginx/html/index.html
[root@d78399ccd3e6 ~]# echo 'web01' >/usr/share/nginx/html/index.html
# 验证并退出容器
http://10.0.0.11
web01
[root@d78399ccd3e6 html]# ctrl+d
3. 将安装好服务的容器提交为镜像
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d78399ccd3e6 centos:7 "/bin/bash" 31 minutes ago Exited (0) 12 seconds ago nervous_chatelet
[root@docker01 ~]# docker container commit d78399ccd3e6 centos7_nginx:v1
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7_nginx v1 8ef62bd3235f 20 seconds ago 491MB
# 基于镜像,起容器
[root@docker01 ~]# docker run -d centos7_nginx:v1 #因为初始命令为/bin/bash,所以放后台会直接死
[root@docker01 ~]# docker run -d -p 80:80 centos7_nginx:v1 nginx -g 'daemon off;'
(2)制作一个支持ssh登录的镜像
# 提前查看sshd服务
[root@docker01 ~]# which sshd
/usr/sbin/sshd
# 查看这个文件属于哪一个rpm包
[root@docker01 ~]# rpm -qf /usr/sbin/sshd
openssh-server-7.4p1-21.el7.x86_64
# 启动一个基础容器,安装服务
[root@docker01 ~]# docker run -it -p 1022:22 centos:7
# 安装yum源和epel源
[root@d78399ccd3e6 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@d78399ccd3e6 ~]# curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
# 安装sshd服务
[root@7ea8724b7da6 ~]# yum install openssh-server -y
# 在容器里不能使用systemctl start sshd, 查看如何进行启动
[root@7ea8724b7da6 ~]# cat /usr/lib/systemd/system/sshd.service
# 手动进行启动,报错Could not load host key: /etc/ssh/ssh_host_rsa_key Could not load hostkey: /etc/ssh/ssh_host_ecdsa_key Could not load host key: /etc/ssh/ssh_host_ed25519_key sshd: no hostkeys available -- exiting.
[root@7ea8724b7da6 ~]# /usr/sbin/sshd -D
# 容器外进行查看这个目录里的文件,都有上面显示的报错内容的文件
[root@docker01 ~]# ls /etc/ssh/
[root@7ea8724b7da6 ~]# cat /usr/lib/systemd/system/sshd-keygen.service
# 报错缺少/usr/sbin/sshd-keygen: line 10: /etc/rc.d/init.d/functions: No such file or directory
[root@7ea8724b7da6 ~]# /usr/sbin/sshd-keygen
# 进行安装functions的安装包
[root@7ea8724b7da6 ~]# yum install initscripts -y
[root@7ea8724b7da6 ~]# /usr/sbin/sshd-keygen
[root@7ea8724b7da6 ~]# ls /etc/ssh/
[root@7ea8724b7da6 ~]# /usr/sbin/sshd
# 在容器里面创建用户
echo "123456" | passwd --stdin root
# 偷偷的离开ctrl+p,ctrl+q 这样容器不会死
[root@7ea8724b7da6 ~]# ctrl+p,ctrl+q
# 将容器提交为镜像(容器死的活的都能提交为镜像)
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ea8724b7da6 centos:7 "/bin/bash" 23 minutes ago Up 23 minutes 0.0.0.0:1022->22/tcp, :::1022->22/tcp awesome_bohr
[root@docker01 ~]# docker commit 7ea8724b7da6 centos7_sshd:v1
# 将刚commit的镜像启动一个容器,然后进行测试功能
[root@docker01 ~]# docker run -d -p 1023:22 centos7_sshd:v1 /usr/sbin/sshd -D
[root@docker01 ~]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f338aa116a8 centos7_sshd:v1 "/usr/sbin/sshd -D" About a minute ago Up About a minute 0.0.0.0:1023->22/tcp, :::1023->22/tcp exciting_napier
[root@docker01 ~]# ssh root@10.0.0.11 -p 1023
# 小提示: 如果想要在进入容器,使用attach,好处是使用同一个终端,还能看到之前操作过的命令
docker attach 容器id
(3)制作一个基于centos7系统的nginx+sshd双服务镜像
# 批量清理容器,生产环境谨慎操作!!!
[root@docker01 ~]# docker rm -f `docker ps -a -q`
# 利用镜像启动容器时,会还原/etc/hosts文件,如果需要hosts解析需要重新配置
# 利用制作好的nginx的镜像,起一个容器,然后在安装sshd服务
[root@docker01 ~]# docker run -it -p 81:80 -p 2022:22 centos7_nginx:v1 /bin/bash
# 进入容器进行安装sshd服务
[root@7ea8724b7da6 ~]# yum -y install openssh-server initscripts
[root@7ea8724b7da6 ~]# /usr/sbin/sshd-keygen
[root@7ea8724b7da6 ~]# echo "123456" | passwd --stdin root
# 如果镜像有多个服务,那么把每个服务的启动命令都写在要给脚本中,前几个命令都正常启动,最后一个命令hang住就可以了
[root@7ea8724b7da6 ~]# vi init.sh
#!/bin/bsh
nginx
/usr/sbin/sshd -D
# 执行脚本,看是否有进程或者查看正常提供服务
[root@7ea8724b7da6 ~]# /bin/bash init.sh
# 重启打开一个sh终端进行查看,查看是否有进程存在,可以看出容器中跑了哪些进程
[root@docker01 ~]# docker container top 7ea8724b7da6
[root@docker01 ~]# docker ps -a
# 提交制作好的镜像
[root@docker01 ~]# docker commit 99e70e98518d centos7_nginx_sshd:v1
# 查看存在的镜像
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7_nginx_sshd v1 c9b08cd520ea 35 minutes ago 750MB
# 利用centos7_nginx_sshd:v1启动容器
[root@docker01 ~]# docker run -d -p 80:80 -p 2023:22 centos7_nginx_sshd:v1 /bin/bash /root/init.sh
[root@docker01 ~]# curl 10.0.0.11
[root@docker01 ~]# ssh root@10.0.0.11 -p 2023
(4) 环境变量和特权容器
# 环境变量的应用
[root@docker01 ~]# docker run -d -p 80:80 -p 2023:22 centos7_nginx_sshd:v1 /bin/bash /root/init.sh
[root@docker01 ~]# docker exec -it 0d991e68567b /bin/bash
# 设置变量$SSH_PASS,启动容器的时候可以自定义密码
[root@0d991e68567b ~]# vi init.sh
#!/bin/bsh
echo "$SSH_PASS"|passwd --stdin root
nginx
/usr/sbin/sshd -D
# 退出容器
[root@0d991e68567b ~]# ctrl+d
# 提交commit容器的时候,尽量让容器处于关闭状态,有些容器在启动的时候会有pid,socket文件等,如果在运行状态的话就会有这些文件,下次启动服务的时候,上来就会判断pid文件是否存在,存在的话就不启动
[root@docker01 ~]# docker stop 0d991e68567b
[root@docker01 ~]# docker commit 0d991e68567b centos7_nginx_sshd:v2
# 启动测试,使用刚提交的镜像启动容器,--env简写-e, env查看环境变量的命令
[root@docker01 ~]# docker run -d -p 80:80 -p 2023:22 --env "SSH_PASS=123456" centos7_nginx_sshd:v2 /bin/bash /root/init.sh
==============================================================
# 特权容器--privileged=true
# 容器和宿主机共用一个内核,容器默认不允许修改内核参数( sysctl -a | grep ipv4| grep forward)
sysctl net.ipv4.ip_forward=0 # 报错
# 容器如何修改内核参数:
--privileged=true # 创建容器的时候加上这个参数,就可以修改内核参数,这个是特权容器
sysctl net.ipv4.ip_forward=0 # 容器的修改了,但是宿主机的内核参数没有变动
(5)制作一个基于centos7系统的kod网盘的镜像(多服务)
# (1) 启动一个容器
docker run -it -p 80:80 centos7_nginx:v1 /bin/bash
# (2) 安装php,配置php
# 扩展库类似于插件,目前只安装php的主程序,,注意:安装完新插件要重启一下
[root@5999a08e7cab ~]# yum install php-fpm php-gd php-mbstring -y
[root@5999a08e7cab ~]# php-fpm --help
[root@5999a08e7cab ~]# php -m # 查看最小化安装的模块
# 修改php的配置文件
[root@5999a08e7cab ~]# vim /etc/php-fpm.d/www.conf
user = nginx
group = nginx
# 启动php,不能使用systemctl start php-fpm进行启动
# 进行手动启动
[root@5999a08e7cab ~]# cat /usr/lib/systemd/php-fpm.service
[Service]
ExecStart=/usr/sbin/php-fpm --nodaemonize # 前台启动
[root@5999a08e7cab ~]# php-fpm -D # 前台启动
# (3) 修改nginx配置
# 修改nginx配置文件
[root@5999a08e7cab ~]# grep -Ev '^$|#' /etc/nginx/nginx.conf.default
[root@5999a08e7cab ~]# grep -Ev '^$|#' /etc/nginx/nginx.conf.default > /etc/nginx/nginx.conf
# 查找关于php相关的配置,复制到nginx.conf文件中
[root@5999a08e7cab ~]# cat /etc/nginx/nginx.conf.default
#修改nginx.conf配置
[root@5999a08e7cab /]# vim /etc/nginx/nginx.conf
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 /code;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /code;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /code$fastcgi_script_name;
include fastcgi_params;
}
}
}
[root@5999a08e7cab /]# nginx -t
[root@5999a08e7cab /]# nginx
# (4) 上传软件kodexplorer
[root@5999a08e7cab /]# mkdir /code
# 将/mnt/kodexplorer4.40.zip拷贝至容器
[root@docker01 ~]#docker cp /mnt/kodexplorer4.40.zip 5999a08e7cab:/code
[root@5999a08e7cab code]# cd /code
[root@5999a08e7cab code]# yum -y install unzip
[root@5999a08e7cab code]# unzip kodexplorer4.40.zip
[root@5999a08e7cab code]# chmod -R 777 /code/
[root@5999a08e7cab code]# chown -R nginx:nginx .
# 容器初始化脚本
[root@5999a08e7cab code]# vim /init.sh
#!/bin/bash
php-fpm -D
nginx -g 'daemon off;'
# (5) 提交容器5999a08e7cab为镜像kod:v1
[root@docker01 ~]# docker commit 5999a08e7cab kod:v1
[root@docker01 ~]# docker run -d -p 81:80 kod:v1 /bin/bash /init.sh
[root@docker01 ~]# docker ps -a -l
2. 自动制作docker镜像
2.1 项目上线方式
(1)非镜像容器上线

(2)镜像容器上线

2.2 dockerfile制作镜像
镜像:中药
dockerfile: 配方
(1)dockerfile常用指令
FROM # 基础镜像
RUN # 制作镜像过程中需要的执行命令 (安装服务)
CMD # 容器启动的时候执行的初始命令,容易被替换 (启动服务)
ENTRYPOINT # 容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
ADD # 把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包)
COPY # 把dockerfile 当前目录下的文件拷贝到容器中(不解压tar包)
WORKDIR # 指定容器的默认工作目录
EXPOSE # 镜像要暴露的端口
VOLUME # 持久化卷
ENV # 环境变量(ssh的密码,数据库的密码)
LABEL # 镜像的属性标签
MAINTAINER # 管理者标识
(2)根据dockerfile自动构建镜像的思路
(1) 手动制作docker镜像,记录历史命令
(2) 根据历史命令编写dockerfile文件
(3) docker build构建docker镜像
(4) 测试镜像的功能
举个栗子:
栗子一: 用dockerfile制作nginx服务,使用FROM,RUN,CMD指令实现
# (1) 创建存放dockerfile的目录
[root@docker01 ~]# mkdir /opt/dockerfile/centos7_nginx
# (2) 书写dockerfile,制作nginx的镜像。高版本的docker,dockerfile和Dockerfile都可以
[root@docker01 ~]# vim /opt/dockerfile/centos7_nginx/dockerfile
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx -y
RUN rm -rf /usr/share/nginx/html/index.html
RUN echo 'web01' >/usr/share/nginx/html/index.html
# CMD nginx -g 'daemon off; 这样也可以,官方更推荐另外一种写法,并且这种写法用docker ps的时候显示不好看
CMD ["nginx","-g","daemon off;"]
# (3) 使用dockerfile制作镜像
## 方式一: 全路径的方式(-t是给镜像起一个名字)
[root@docker01 ~]# docker image build -t centos7_nginx:v2 /opt/dockerfile/centos7_nginx
## 方式二: 相对路径的方式 (-t是给镜像起一个名字)
[root@docker01 ~]# cd /opt/dockerfile/centos7_nginx
[root@docker01 centos7_nginx]# docker image build -t centos7_nginx:v2 .
## 走内部网络,这里是外部网络,如果宿主机有hosts劫持,就先走宿主机的网络
[root@docker01 centos7_nginx]# docker image build --network-host -t centos7_nginx:v2 .
# (4) 利用刚制作好的镜像,起一个容器
[root@docker01 ~]# docker run -d -p 90:80 centos7_nginx:v2
栗子二: 使用docker制作yiliao网页镜像,使用ADD和COPY指令,并且说明他们的相同点和不同点
# (1) 创建存放dockerfile文件的目录,使用ADD指令
[root@docker01 ~]# mkdir -p /opt/dockerfile/yiliao
[root@docker01 ~]# cd /opt/dockerfile/yiliao
# 上传yiliao目录,yiliao目录里面时前端代码
[root@docker01 yiliao]# ls
dockerfile yiliao
# 书写dockerfile
[root@docker01 yiliao]# cat dockerfile
FROM centos7_nginx:v2
RUN rm -rf /usr/share/nginx/html/*
ADD yiliao /usr/share/nginx/html
# 执行dockerfile,制作镜像
[root@docker01 yiliao]# docker build -t yiliao:v1 .
# 查看是否有yiliao:v1这个镜像
[root@docker01 yiliao]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yiliao v1 996170b0cd1d 17 hours ago 493MB
# 使用yiliao:v1镜像启动容器,然后浏览器进行验证
[root@docker01 yiliao]# docker run -d -p 92:80 yiliao:v1
https//10.0.0.11:92
# (2) 修改dockerfile,使用COPY指令
[root@docker01 yiliao]# cat dockerfile
FROM centos7_nginx:v2
RUN rm -rf /usr/share/nginx/html/*
COPY yiliao /usr/share/nginx/html
# 执行dockerfile,制作镜像
[root@docker01 yiliao]# docker build -t yiliao:v2 .
# 使用yiliao:v2起一个容器,然后浏览器进行验证
[root@docker01 yiliao]# docker run -d -p 93:80 yiliao:v2
https//10.0.0.11:93
总结: ADD和COPY都可以把目录中的文件拷贝到容器中
=======================================================================
# 进入医疗前端项目中
[root@docker01 yiliao]# cd yiliao
[root@docker01 yiliao]# tar zcf ../yiliao.tar.gz *
# 修改dockerfile内容
[root@docker01 yiliao]# cat dockerfile
FROM centos7_nginx:v2
RUN rm -rf /usr/share/nginx/html/*
ADD yiliao.tar.gz /usr/share/nginx/html
# 执行dockerfile,制作镜像
[root@docker01 yiliao]# docker build -t yiliao:v3 .
# 使用yiliao:v3镜像起一个容器
[root@docker01 yiliao]# docker run -d -p 94:80 yiliao:v3
总结: ADD可以把tar包解压后的文件放入到指定容器中
ADD指令还有一个独一无二的能力,上面说了它可以把解压后的文件放入到容器中,但是感觉这个功能有点鸡肋,他强大之处在于可以做基础镜像。比如像这样的基础镜像,比如centos,ubuntu,debian这种镜像是别人做出来的,如何做出来的那,自己可以做吗?当然是可以的,像centos基础镜像,原始的起点就是需要把/目录下的基础文件打出tar包,然后放入容器中。这个就不自己弄了,因为系统跑起来之后,有一些文件时内存里面的/proc,/sys,可以直接下载现成的
# 下载/目录下文件打包好的压缩包,地址:https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/alpine/3.18/amd64/default/20230714_13%3A00/
[root@docker01 ~]# mkdir -p /opt/dockerfile/alpine_dk
[root@docker01 ~]# cd /opt/dockerfile/alpine_dk
[root@docker01 alpine_dk]# ls
dockerfile rootfs.tar.xz
# FROM scratch 这个是制作镜像的起点
[root@docker01 alpine_dk]# cat dockerfile
FROM scratch
ADD rootfs.tar.xz /
CMD ["/bin/sh"]
[root@docker01 alpine_dk]# docker build -t alpine_dk:v1 .
[root@docker01 alpine_dk]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine_dk v1 426f8a0ce7a3 6 minutes ago 9.54MB
[root@docker01 alpine_dk]# docker run -it alpine_dk:v1
栗子三: 举例子说明WORKDIR 、EXPOSE、VOLUME 、 ENV 指令
(1) 说明WORKDIR指令
[root@docker01 ~]# cd /opt/dockerfile/alpine_dk
[root@docker01 alpine_dk]# ls /opt/dockerfile/alpine_dk
dockerfile rootfs.tar.xz
# WORKDIR /root相当于在容器里cd /root
[root@docker01 alpine_dk]# cat dockerfile
FROM scratch
ADD rootfs.tar.xz /
WORKDIR /root
COPY rootfs.tar.xz .
CMD ["/bin/sh"]
# 执行dockerfile制作镜像
[root@docker01 alpine_dk]# docker build -t alpine_dk:v3 .
# 查看制作的镜像
[root@docker01 alpine_dk]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine_dk v3 3d011a93cc96 5 seconds ago 12.5MB
# 使用alpine_dk:v3镜像起一个容器并进入容器,进行验证COPY rootfs.tar.xz .是否把rootfs.tar.xz这个包拷到容器的/root下
[root@docker01 alpine_dk]# docker run -it alpine_dk:v3
~ # ls
rootfs.tar.xz
(2) 说明EXPOSE指令
# 启动一个容器
[root@docker01 centos7_nginx]# docker run -d centos7_nginx_sshd:v1
97c39cad587b76a2b6b76dde78b42ddbb614ae7d632b972896daf36bbbdaa5fa
# -P宿主机生成随机端口号
[root@docker01 centos7_nginx]# docker run -d -P centos7_nginx_sshd:v1
c02d5272ede41ed5a4df3c168e45b99e0b70a562d8118d0ac5b6e139750cc326
# 容器里面没有服务启动,容器里面也没有默认的监听端口,所以起的两个容器使用docker ps -a进行查看的时候PORT为空
[root@docker01 centos7_nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c02d5272ede4 centos7_nginx_sshd:v1 "/bin/bash" 2 seconds ago Exited (0) 1 second ago goofy_beaver
97c39cad587b centos7_nginx_sshd:v1 "/bin/bash" About a minute ago Exited (0) About a minute ago admiring_gauss
# 开始使用EXPOSE指令EXPOSE 80
[root@docker01 centos7_nginx]# cd /opt/dockerfile/centos7_nginx
# 在dockerfile中添加
[root@docker01 centos7_nginx]# cat dockerfile
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx -y
RUN rm -rf /usr/share/nginx/html/index.html
RUN echo 'web01' >/usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
# 执行dockerfile制作镜像
[root@docker01 centos7_nginx]# docker build -t centos7_nginx:v3 .
# 使用centos7_nginx:v3起一个容器,不加-P和加-P
[root@docker01 centos7_nginx]# docker run -d centos7_nginx:v3
c7a32b0fa7d03fc62443466e87bf566b6ad3435c5cd35228fec8babf0c7be930
[root@docker01 centos7_nginx]# docker run -d -P centos7_nginx:v3
c68d5ed2c9f4c4521ae57f55bac67bf2397d0c303ac98cdc5adfce2ee334a88e
# 不加-P的,直接显示容器监听80/tcp端口,加-P的宿主机会随机一个端口对应容器的80端口
[root@docker01 centos7_nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c68d5ed2c9f4 centos7_nginx:v3 "nginx -g 'daemon of…" 3 seconds ago Up 2 seconds 0.0.0.0:32772->80/tcp, :::32772->80/tcp dreamy_dijkstra
c7a32b0fa7d0 centos7_nginx:v3 "nginx -g 'daemon of…" 14 seconds ago Up 12 seconds 80/tcp confident_chatelet
总结: EXPORT 80
# 这个表明容器监听80端口,启动容器的时候-P,宿主机是随机端口,容器是80端口
# 如果起容器的时候不指定端口,docker ps -a的时候,PORT一栏会显示80/tcp
=========================================================================
(3) 说明VOLUME指令
# VOLUME持久化指定的目录,每次启动一个容器,系统会创建一个随机的卷来持久化指定容器中的目录
[root@docker01 centos7_nginx]# cd /opt/dockerfile/centos7_nginx
[root@docker01 centos7_nginx]# cat dockerfile
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum install nginx -y
RUN rm -rf /usr/share/nginx/html/index.html
RUN echo 'web01' >/usr/share/nginx/html/index.html
EXPOSE 80
VOLUME /usr/share/nginx/html
CMD ["nginx","-g","daemon off;"]
[root@docker01 centos7_nginx]# docker build -t centos7_nginx:v5 .
[root@docker01 centos7_nginx]# docker volume ls
DRIVER VOLUME NAME
[root@docker01 centos7_nginx]# docker run -d centos7_nginx:v5
local e9276fe8f4bb7182e0f64c6cce8c2cc4a8b4c66d665f9c99ffe11f668e51639d
(4) 说明ENV指令
[root@docker01 ~]# mkdir /opt/dockerfile/centos7_sshd
[root@docker01 ~]# cd /opt/dockerfile/centos7_sshd
[root@docker01 centos7_sshd]# ls
dockerfile init.sh
# 查看dockerfile init.sh的内容
[root@docker01 centos7_sshd]# cat dockerfile
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum install openssh-server initscripts -y
RUN /usr/sbin/sshd-keygen
COPY init.sh /init.sh
ENV SSH_PASS 123
CMD ["/bin/bash","/init.sh"]
[root@docker01 centos7_sshd]# cat init.sh
#!/bin/bash
echo "$SSH_PASS" | passwd --stdin root
/usr/sbin/sshd -D
# 开始执行dockerfile制作镜像
[root@docker01 centos7_sshd]# docker build -t centos7_nginx_sshd:v3 .
# 使用centos7_nginx_sshd:v3起一个不带密码的容器
[root@docker01 centos7_sshd]# docker run -d -p 3024:22 centos7_nginx_sshd:v3
# 验证效果,初始密码为123
[root@docker01 centos7_sshd]# ssh root@10.0.0.11 -p 3024
# 使用centos7_nginx_sshd:v3起一个不带密码的容器,这个命令行里的密码会覆盖dockerfile里面的初始密码,密码为456
[root@docker01 centos7_sshd]# docker run -d -p 3025:22 --env "SSH_PASS=456" centos7_nginx_sshd:v3
# 进行验证效果
[root@docker01 centos7_sshd]# ssh root@10.0.0.11 -p 3025
2.3 dockerfile综合小练习
利用上面的指令,使用dockerfile制作kod云盘
# 创建存放dockefile文件的目录
[root@docker01 ~]# mkdir -p /opt/dockerfile/kod
[root@docker01 ~]# cd /opt/dockerfile/kod
[root@docker01 kod]# ls
dockerfile init.sh kodexplorer4.40.zip nginx.conf www.conf
# 查看dockerfile文件,下面的文件提前准备
[root@docker01 kod]# cat dockerfile
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx php-fpm php-gd php-mbstring unzip -y
ADD www.conf /etc/php-fpm.d/www.conf
ADD nginx.conf /etc/nginx/nginx.conf
RUN mkdir /code
COPY kodexplorer4.40.zip /code
WORKDIR /code
RUN unzip kodexplorer4.40.zip
RUN chmod -R 777 /code
RUN chown -R nginx:nginx .
ADD init.sh /init.sh
EXPOSE 80
VOLUME /code
CMD ["/bin/bash","/init.sh"]
# 执行dockerfile制作kod云盘镜像,在利用kod:v2起一个容器,进行验证
[root@docker01 kod]# docker build -t kod:v2 .
[root@docker01 kod]# docker run -d -p 80:80 kod:v2
http://10.0.0.11
小提示:
# 可以查看压缩包中的文件
[root@docker01 yiliao]# tar tf yiliao.tar
5131

被折叠的 条评论
为什么被折叠?



