Docker 镜像制作

root
233
文章
0
评论
2020年5月11日19:00:06 评论 12649字阅读42分9秒

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是否正常

 

 

 

 

继续阅读
weinxin
我的微信
这是我的微信扫一扫
  • 文本由 发表于 2020年5月11日19:00:06
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
Harbor镜像仓库 Docker

Harbor镜像仓库

Harbor镜像仓库 一、Harbor特性介绍 基于角色访问控制 每个人角色不同,需求也不同,因此就需要访问权限控制,根据角色分配相应的权限。例如,开发人员需要对项目构建这就需要用到读写权限(push...
Centos7解决systemctl无法使用 Docker

Centos7解决systemctl无法使用

systemd整合: 因为systemd要求CAPSYSADMIN授权,从而得到了读取到宿主机cgroup的能力,Centos7中已经用fakesystemd代替了systemd来解决依赖问题。如果仍...
Dockaer网络 Docker

Dockaer网络

Dockaer网络 docker本地网络类型 查看本地支持网络类型 docker network ls # docker network ls NETWORK ID NAME DRIVER SCOPE...
Dockerfile练习 Docker

Dockerfile练习

Dockerfile练习 实验一:要求使用centos7基础镜像,搭建httpd+sshd+php的镜像,实现httpd与sshd服务能够正常访问 创建存放dockerfile的目录 mkdir -p...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: