Docker(二)

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服务,使用FROMRUNCMD指令实现

# (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网页镜像,使用ADDCOPY指令,并且说明他们的相同点和不同点

# (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

栗子三: 举例子说明WORKDIREXPOSEVOLUMEENV 指令

(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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值