Docker 镜像制作
Centos6基于容器的镜像制作(centos6.9_sshd 单服务)
给Centos6.9进行,开启容器,下载opensshd*,把这个容器打包成一个镜像
docker commit 容器名称/容器ID 起个镜像名称:标签名称
[root@hwf ~]# docker commit centos6.9 kk/cnetos6.9_sshd:v1
sha256:674a02db5d83bfadc1bda2a904de51e68b4871f7987fca7f7e42fa233c40ff15
进行查看image
[root@hwf ~]# docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
kk/cnetos6.9_sshd v1 674a02db5d83 46 seconds ago 363MB
使用这个容器放在后台,使这个容器自动启动sshd服务
/usr/sbin/sshd -D
docker container run -d --name="kk/centos6.9" 镜像ID/进行名称 /usr/sbin/sshd -D
[root@hwf ~]# docker container run -d --name="kk" 674a02db5d83 /usr/sbin/sshd -D b15f4b5da1e8cee48103f2d2463284049455d9a798375006a244020b51c480ef [root@hwf ~]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b15f4b5da1e8 674a02db5d83 "/usr/sbin/sshd -D" 7 seconds ago Up 6 seconds kk
宿主机进行验证,后端的容器是否能用sshd服务进行连接
[root@hwf ~]# ssh root@172.17.0.2
root@172.17.0.2's password:
Last login: Mon May 11 07:55:26 2020 from 172.17.0.1
[root@b15f4b5da1e8 ~]#
注意:
这里只能用-d 守护式进行,要是用-it默认,第一个进程是/bin/bash,这样sshd就没有办法启动了
对容器开放映射端口,用xshell远程连接到容器
docker container run -d --name="haha" -p 222:22 容器名称/容器ID /usr/sbin/sshd -D
连接192.168.1.3:222端口进行测试
Last login: Mon May 11 09:30:55 2020 from 172.17.0.1 [root@e4573ae5872b ~]#
构建企业镜像(centos6.9_sshd_lnmp_bbs)
启动基础镜像容器
docker run -it --name="Kk_centos_bbs" -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html/ --restart=on-failure:3 --network=bridge centos:6.9
优化yum源并安装软件
mv /etc/yum.repo.d/* /mnt/
vi /etc/yum.repo.d/httpd.repo
[httpd]
name=httpd
baseurl=http://172.17.0.1/centos
gpgcheck=0
yum clean all
yum makecache
安装依赖包
yum -y install openssh* httpd mysql* php php-mysql
ssh初始化
/etc/init.d/sshd start
echo "123456" |passwd --stdin root
mysql初始化
/etc/init.d/mysqld start
会把数据初始化到/var/lib/mysql/文件里面
创建root用户,discuz用户
mysql
grant all on *.* to root@'%' identified by '123';
grant all on *.* to discuz@'%' identified by '123';
create database discuz charset utf8mb4
5.1:
create database discuz charset utf8
httpdl初始化
/etc/init.d/httpd start
制作LAMP基础镜像
docker commit Kk_sshd_bbs kk/cen6.9_lamp_sshd:v1
启动这个镜像,开放80端口
docker commit run -it --name="cen6.9_lnmp" -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html/ -p 8080:80 -p 33060:3306 -p 220:22 kk/cen6.9_lamp_sshd:v1
[root@hwf /]# docker container exec -it cen6.9_bbs bash [root@d651749f1b34 /]# cat /var/www/html/index.html 123 [root@d651749f1b34 /]# /etc/init.d/mysqld start Starting mysqld: [ OK ] [root@d651749f1b34 /]# /etc/init.d/httpd start Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2 for ServerName [ OK ] [root@d651749f1b34 /]# /etc/init.d/sshd start Generating SSH2 RSA host key: [ OK ] Generating SSH1 RSA host key: [ OK ] Generating SSH2 DSA host key: [ OK ] Starting sshd: [ OK ]
然后上传bbs的压缩包进行解压
文件权限设置为777
把包解压,包里的ipxx目录内的文件全都移动到站点目录
chmod -R 777/var/www/html/
封装制作地2版镜像
[root@hwf vol]# docker container stop cen6.9_bbs cen6.9_bbs [root@hwf vol]# docker commit cen6.9_bbs kk/centos6.9_bbs:v2 sha256:418e4a4ebae0986d6fed9b324f32159477fbbfb83bc205201cace543c4eea025 [root@hwf vol]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE kk/centos6.9_bbs v2 418e4a4ebae0 4 seconds ago 937MB kk/cen6.9_bbs v1 50fe79064d85 2 hours ago 926MB ubuntu latest 1d622ef86b13 2 weeks ago 73.9MB nginx 1.16 dfcfd8e9a5d3 2 weeks ago 127MB nginx latest 602e111c06b6 2 weeks ago 127MB hello-world latest bf756fb1ae65 4 months ago 13.3kB centos 6.9 2199b8eb8390 14 months ago 195MB
因为启动服务还需要手动启动,要编写一个启动脚本
在数据卷目录的/opt/vol/html/内写一个脚本init.sh
把/usr/sbin/sshd -D写到最后
#!/bin/bash /etc/init.d/mysqld start /etc/init.d/httpd start /usr/sbin/sshd -D
chmod 777 init.sh
启动这个容器的方法
docker container run -d --name="xxx" kk/centos6.9_bbs:v2 -v /var/vol/html:/var/www/html/ -v /var/vol/mysql:/var/lib/mysql -p 800:80 -p 33060:3306 -p 220:22 /var/www/html/init.sh
把容器做为镜像,镜像里指会保留下载的软件,对应命令行添加的参数镜像不会保存
把容器做为镜像,镜像里指会保留下载的软件,对应命令行添加的参数镜像不会保存
把容器做为镜像,镜像里指会保留下载的软件,对应命令行添加的参数镜像不会保存
Centos7基于容器的镜像制作(centos7.5_sshd 单服务)
和6系统不同的是,centos7里面,是没有/etc/init.d/sshd没有启动脚本,其它都一样
docker container run -it --name="Kk_cen7.5_sshd" centos:7.5
sshd初始化
mkdir /var/run/sshd
echo "UseDNS no" >>/etc/ssh/sshd_config
sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd
echo "123456"|passwd --stdin root
/usr/bin/ssh-keygen -A
制作镜像
docker commit Kk_cen7.5_sshd kk/cen7.5_sshd:v1
启动镜像
docker container run -d --name="Kk_c7.5_sshd" -p 222:20 kk/cen7.5_sshd:v1 /usr/sbin/sshd -D
Dockerfile定制企业镜像
Dockerfile的基本使用方式
mkdir -p /opt/dockerfile/centos6.9_sshd
vim /opt/dockerfile/centos6.9_sshd/dockerfile(固定名字)
FROM 必须是开头,代表启动镜像的名字,有两种语法
第一种:图个方便
FROM centos:6.9
第二种:这种更加安全
FROM:
Syntax:
FROM centos:6.9
FROM centos@2199b8eb8390
RUN 代表跑的意思,有两种语法,执行什么命令,构建镜像过程中运行的命令
方法一:这种适用于bash自带的命令,一些程序的独立命令就不行了【常用的就这个】
RUN mv /etc/yum.repo.d/* /tmp/ && echo -e "[httpd]\nname=httpd\nbaseurl=http://172.17.0.1/centos6\nenabled=1\ngpgcheck=0" >/etc/yum.repo.d/httpd.repo && yum clean all && yum mackecache && yum -y install openssh*
方法二:
RUN:
Syntax:
RUN mv /etc/yum.repo.d/* /tmp/ && echo -e "[httpd]\nname=httpd\nbaseurl=http://172.17.0.1/centos6\nenabled=1\ngpgcheck=0" >/etc/yum.repo.d/httpd.repo && yum clean all && yum mackecache && yum -y install openssh*
RUN ["mysqld", "--initialize-insecure","--user=mysql","--basedir=/usr/loacl/mysql","--datadir=/data/mysql/data"](这种针对非bash的命令,第一个是命令体,后面都是参数,一般写道脚本里)
CMD 代表将来有人拿镜像去启动时自动执行一条命令,使用镜像启动容器时运行的命令
守护式容器必加
方法一:
CMD ["/usr/sbin/sshd","-D"]
方法二:
CMD
Syntax:
CMD ["/usr/sbin/sshd","-D"]
EXPOSE 暴露端口
EXPOSE 22
方法一:
要是多个端口就写多个EXPOSE
EXPOSE 22
EXPOSE 80
方法二:
EXPOSE:
Sytax:
EXPOSE: 22
EXPOSE: 80
COPY 把宿主机的文件copy到容器内,封装成镜像
COPY index.php(这个文件要在dockerfile文件所在目录内) /var/www/html/(这里是容器内的目录)
可以支持通配符,如果copy一个目录的话,会只copy目标目录下的子文件或子目录
可以写多个需要copy 的文件,但是目的地只能有一个
COPY [--chown=<user>:<group>]<src>.. <dest>
ADD 也是把宿主机文件copy到容器内,但是对于压缩文件会自动解压
能够解压类型 tar类型的压缩包,加入目录不存在,容器会自动帮助我们创建,如果对普通文件和copy一摸一样,还可以识别URL,通过URL地址上传文件
ADD discuz.tar.gz(这个文件要在dockerfile文件所在目录内) /var/www/html(这里是容器内的目录)
ADD https://czczczxcas/dadadaxx/zxczxc /var/www/html 【但是这样方式下载下来文件,不会解压,即使是tar格式的压缩包】
可以支持通配符,如果copy一个目录的话,会只copy目标目录下的子文件或子目录
可以写多个需要copy 的文件,但是目的地只能有一个
ADD [--chown=<user>:<group>]<src>... <dest>
VOLUME 数据卷,可以在启动容器的时候自动挂载数据卷
VOLUME ["/data1","/data2"...]这种是声明多个文件
VOLUME /share/data 这种是声明一个文件
VOLUME指令只是起到了声明了容器中的目录作为匿名卷,但是并没有将匿名卷绑定到宿主机指定目录的功能。但是当我们生成镜像的Dockerfile中以Volume声明了匿名卷,并且我们以这个镜像run了一个容器的时候,docker会在安装目录下的指定目录下面生成一个目录来绑定容器的匿名卷(这个指定目录不同版本的docker会有所不同)
就是说这个指令,所使用的是你容器卷里的目录,你要是想进行指定关联,那么你在启动一个容器的时候,-v就要去指定好,宿主机的地址要对应的你现在使用volume指令声明的目的地,那么要是你在启动容器的时候没有使用run -v去指定目录,既然你在dockerfile中已经声明过了,那么它就会默认在你的docker的安装目录下生成一个目录来绑定dockerfile中volume指令的声明文件
WORKDIR 相当于cd的命令
这个了解就行了,这个指令进去了,默认就是所有操作都在这个目录内进行
要是使用cd命令的话使用 RUN cd这种形式
ENV 声明我们想要的一些变量
就当定义变量
ENV XX="/var/www/html"
ENV XXX="/data/mysql/data/"
要想调用用这个变量
Dockerfile的所有指令里都可以使用${ }调用ENV指定声明的变量
USER 你要执行什么命令,切换什么身份去操作
ENTRYPOINT 拿这个镜像构建容器时运行的命令
ENTRYPOINT 与CMD指令的区别:
- CMD指定容器最后一个运行的进程
- ENTRYPOINT 先说没有这个命令,就是你在制作容器的时候在命令行最后面加一条进程,就会把你dockerfile里CMD指令声明的进程给替代掉,而你加路ENTPYPOINT指令去声明进程,以后在命令行写的进程就不会把原先的代替掉
ENTRYPOINT ["/bin/bash","/init.sh"]
Dockerfile 制作centos6.9镜像sshd单服务
# Centos6.9-SSHDv1.0 FROM centos:6.9 RUN mv /etc/yum.repos.d/* /tmp/ && echo -e "[httpd]\nname=httpd\nbaseurl=http://172.17.0.1/centos6\nenabled=1\ngpgcheck=0" >/etc/yum.repos.d/httpd.repo && yum clean all && yum mackecache && yum -y install openssh* RUN /etc/init.d/sshd start && /etc/init.d/sshd stop && echo "123456" |passwd --stdin root EXPOSE 22 CMD ["/usr/sbin/sshd","-D"]
通过dockerfile制作镜像
docker image build -t "kk/centos6.9_sshd:v1.0" ./[dockerfile文件的所在目录执行这个命令]
dockerfile构建lamp的基础环境
mkdir -p /opt/dockerfile/lamp
vim /opt/dockerfile/lamp/dockerfile
# Centos6.9_SSHD_LAMP
FROM centos:6.9
RUN echo -e "[httpd]\nname=httpd\nbaseurl=http://172.17.0.1/centos6\nenabled=1\ngpgcheck=0" >/etc/yum.repos.d/httpd.repo" && yum clean all && yum makecache && yum -y install httpd openssh* mysql mysql-server php php-mysql
RUN /etc/init.d/httpd start && /etc/init.d/mysqld start && /etc/init.d/sshd start && echo "123456"|passwd --stdin root
RUN mysql -e "grant all on *.* to root@'%' identified by '123';grant all on *.* to discuz@'%' identified by '123';create database discuz charset utf8;"
COPY init.sh /
ADD discuz.tar.gz /var/www/html/
EXPOSE 22
EXPOSE 80
EXPOSE 3306
CMD ["/bin/bash","/init.sh"]
现在使用dockerdfile创建容器
docker image build -t "kk/cen6.9_sshd_lamp" .
在第四步的时候报错
Removing intermediate container 56fa277e2c23 ---> dde9544d8a02 Step 4/10 : RUN mysql -e "grant all on *.* root@'%' to idenitified by "123";grant all on *.* discuz@'%' to identified by "123" ;create datanase discuz charset utf8;" ---> Running in c083633c44a6 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) The command '/bin/sh -c mysql -e "grant all on *.* root@'%' to idenitified by "123";grant all on *.* discuz@'%' to identified by "123" ;create datanase discuz charset utf8;"' returned a non-zero code: 1
进行错误调试
进行查看镜像,发现一个虚悬镜像
[root@hwf lamp]# docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> dde9544d8a02 46 minutes ago 469MB
第四步出现了问题,登陆到第三部里进行查看
docker container run -it dde9544d8a02 bash
我发现它这个报错执行了一个命令,在系统里使用这个命令
The command '/bin/sh -c mysql -e "grant all on *.* root@'%' to idenitified by "123";grant all on *.* discuz@'%' to identified by "123" ;create datanase discuz charset utf8;"' returned a non-zero code: 1
在第三部的容器里进行测试,发现命令没有执行
[root@8e3aa9dbd23a /]# /etc/init.d/mysqld start Starting mysqld: [ OK ] [root@8e3aa9dbd23a /]# ls /var/lib/mysql/ ibdata1 ib_logfile0 ib_logfile1 mysql mysql.sock test [root@8e3aa9dbd23a /]# /bin/sh -c mysql -e "grant all on *.* to root@'%' identified by '123';grant all on *.* to discuz@'%' identified by '123';create database discuz charset utf8;" Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.1.73 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select user,host from mysql.user; +------+--------------+ | user | host | +------+--------------+ | root | 127.0.0.1 | | | 56fa277e2c23 | | root | 56fa277e2c23 | | | localhost | | root | localhost | +------+--------------+ 5 rows in set (0.00 sec) mysql>
问题就在这条命令上,使用脚本的方式解决命令的执行问题,执行成功
[root@8e3aa9dbd23a /]# vi /x.sh #!/bin/bash mysql -e "grant all on *.* to root@'%' identified by '123';grant all on *.* to discuz@'%' identified by '123';create database discuz charset utf8;" [root@8e3aa9dbd23a /]# sh /x.sh [root@8e3aa9dbd23a /]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.1.73 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select user,host from mysql.user; +--------+--------------+ | user | host | +--------+--------------+ | discuz | % | | root | % | | root | 127.0.0.1 | | | 56fa277e2c23 | | root | 56fa277e2c23 | | | localhost | | root | localhost | +--------+--------------+ 7 rows in set (0.00 sec)
那把这个脚本里的命令,添加到CMD里的init.sh脚本里,加到启动mysql下方
#!/bin/bash
/etc/init.d/httpd start
/etc/init.d/mysqld start
mysql -e "grant all on *.* to root@'%' identified by '123';grant all on *.* to discuz@'%' identified by '123';create database discuz charset utf8;"
/usr/sbin/sshd -D
再次使用dockerfile进行构建镜像
[root@hwf lamp]# docker image build -t "kk/cen6.9_sshd_lamp" .
Sending build context to Docker daemon 9.82MB
Step 1/9 : FROM centos:6.9
---> 2199b8eb8390
Step 2/9 : RUN yum -y install mysql mysql-server php php-mysql openssh* httpd
---> Using cache
---> 716ae8338333
Step 3/9 : RUN /etc/init.d/httpd start && /etc/init.d/mysqld start && /etc/init.d/sshd start && /etc/init.d/sshd stop && echo "123456"|passwd --stdin root
---> Using cache
---> dde9544d8a02
Step 4/9 : COPY init.sh /
---> 9b3bbe176c68
Step 5/9 : ADD discuz.tar.gz /var/www/html/
---> a4834aa0891f
Step 6/9 : EXPOSE 22
---> Running in 4b5152cc48f7
Removing intermediate container 4b5152cc48f7
---> 063aef484ce8
Step 7/9 : EXPOSE 3306
---> Running in 9a1fe7ad7670
Removing intermediate container 9a1fe7ad7670
---> 624c7f3b89e0
Step 8/9 : EXPOSE 80
---> Running in 8a3f5e2915e1
Removing intermediate container 8a3f5e2915e1
---> b9608aa03583
Step 9/9 : CMD ["/bin/bash","/init.sh"]
---> Running in 1a986526bd61
Removing intermediate container 1a986526bd61
---> 10860ff05624
Successfully built 10860ff05624
Successfully tagged kk/cen6.9_sshd_lamp:latest
进行查看镜像
[root@hwf lamp]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
kk/cen6.9_sshd_lamp latest 10860ff05624 2 minutes ago 496MB
kk/centos6.9_bbs v2 418e4a4ebae0 12 hours ago 937MB
kk/cen6.9_bbs v1 50fe79064d85 14 hours ago 926MB
ubuntu latest 1d622ef86b13 2 weeks ago 73.9MB
nginx 1.16 dfcfd8e9a5d3 2 weeks ago 127MB
nginx latest 602e111c06b6 2 weeks ago 127MB
hello-world latest bf756fb1ae65 4 months ago 13.3kB
centos 6.9 2199b8eb8390 14 months ago 195MB
启动镜像康康
[root@hwf lamp]# docker container run -d -p 220:22 -p 336:3306 -p 800:80 10860ff05624 7e8401de59d177fc4c2621f3da04ec92d9594f80b672bb2b37451656bbeddc61 [root@hwf lamp]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7e8401de59d1 10860ff05624 "/bin/bash /init.sh" 13 seconds ago Up 12 seconds 0.0.0.0:220->22/tcp, 0.0.0.0:800->80/tcp, 0.0.0.0:336->3306/tcp nervous_yonath
进行测试
这里说一点,压缩包可能解压的时候没有把里面的内容释放出来,压缩包要用那种解压出来就可以访问到的,而不是解压出来以后单独是一个文件夹,还有就是要把默认的站点目录权限改为777
修改一下init.d
#!/bin/bash
/etc/init.d/httpd start
/etc/init.d/mysqld start
mysql -e "grant all on *.* to root@'%' identified by '123';grant all on *.* to discuz@'%' identified by '123';create database discuz charset utf8;"
chmod -R 777 /var/www/html/
/usr/sbin/sshd -D
查看MySQL是否正常

评论