1.手动制作docker镜像

手动构建docker镜像的思路:首先运行一个容器,进入容器里面,安装所需程序,退出容器,提交容器为镜像即可

1.1.手动构建centos镜像

1.1.1.配置容器

1.首先运行一个容器
[root@docker01 ~]# docker run -d -it --privileged -p 2222:22 --name centos8.2 centos:latest  /usr/sbin/init 
--privileged: 指定容器是否为特权容器,特权容器拥有所有的功能
想要启动服务一定要首先运行/usr/sbin/init如果不运行init第一个进程的话启动服务会报错,报错内容:    System has not been booted with systemd as init system (PID 1). Can't operate.

2.配置yum仓库
[root@docker01 ~]# docker exec -it centos8.2 /bin/bash
[root@af89d2152479 /]# cd /etc/yum.repos.d/
[root@af89d2152479 yum.repos.d]# rm -rf *
[root@af89d2152479 yum.repos.d]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-8repo ;curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo

3.安装并启动ssh服务
[root@af89d2152479 yum.repos.d]# yum -y install openssh-server
[root@af89d2152479 yum.repos.d]# systemctl start sshd
[root@af89d2152479 ~]# systemctl enable sshd

4.设置root口令
[root@af89d2152479 ]# yum -y install passwd
[root@af89d2152479 ~]# echo redhat | passwd --stdin root

5.安装其他所需软件
[root@af89d2152479 ~]# yum -y install vim 
[root@af89d2152479 ~]# yum -y install libvirt
[root@af89d2152479 ~]# yum -y install man


6.设置命令别名
[root@af89d2152479 ~]# vim .bashrc 
alias ls='ls --color'

7.通过ssh连接容器
[C:\~]$ ssh 192.168.81.210 2222

手动制作Docker镜像及dockerfile初步入门(五)_f5

1.1.2.提交容器为镜像并测试

语法格式:

​ docker container commit 容器名/id 镜像名:版本

1.提交容器为镜像
[root@docker01 ~]# docker container commit centos8.2 jxl_centos8.2:v1
sha256:9a83652bb4121eab62ee6e2e3f254e97eccb9f4ec62aeb0c1d6e3c9421e3e323

2.查看镜像列表
[root@docker01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jxl_centos8.2       v1                  9a83652bb412        3 minutes ago       551MB
centos              latest              831691599b88        6 days ago          215MB
nginx               latest              2622e6cca7eb        13 days ago         132MB
httpd24             latest              ccbcea8a6757        2 weeks ago         166MB
httpd               2.4                 ccbcea8a6757        2 weeks ago         166MB
http_test           latest              e06c3dbbfe23        2 years ago         171MB
第一个就是,3分钟前创建

3.验证容器是否可用
[root@docker01 ~]# docker run -d -it -p 4444:22 jxl_centos8.2:v1 /usr/sbin/sshd -D
100a00f81bb8f00b33c2aa0c655ef9fa54884adc4f0a00c5bff34b9a9a138f99

[root@docker01 ~]# docker ps -a -l
CONTAINER ID        IMAGE               COMMAND               CREATED              STATUS              PORTS                  NAMES
100a00f81bb8        jxl_centos8.2:v1    "/usr/sbin/sshd -D"   About a minute ago   Up About a minute   0.0.0.0:4444->22/tcp   great_joliot

4.登录容器
[root@docker01 ~]# docker exec -it great_joliot /bin/bash
[root@100a00f81bb8 /]# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 14:21 pts/0    00:00:00 /usr/sbin/sshd -D

手动制作Docker镜像及dockerfile初步入门(五)_nginx_02

1.2.手动构建nginx镜像

1.2.1.配置nginx容器

1.运行一个空镜像
[root@docker01 ~]# docker run -itd --privileged -p 80:80 centos:latest /usr/sbin/init
8c1143a3026345b40c5377f326036570c16426f4c27ce4f5b0d3eba110b05dd8


2.进入容器
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
8c1143a30263        centos:latest       "/usr/sbin/init"    2 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp   nice_liskov
[root@docker01 ~]# docker exec -it nice_liskov /bin/bash

3.配置yum仓库
root         302     289  0 07:08 pts/1    00:00:00 ps -ef
[root@8c1143a30263 /]# cd /etc/yum.repos.d/
[root@8c1143a30263 yum.repos.d]# rm -rf *

4.安装nginx镜像
[root@8c1143a30263 yum.repos.d]# yum -y install nginx

5.启动镜像
[root@8c1143a30263 yum.repos.d]# systemctl start nginx

1.2.2.提交容器为镜像并测试

1.提交容器
[root@docker01 ~]# docker commit 8c1143a30263 centos82_nginx:v1
sha256:b5f6155f23898487672546f90de321457369016284011dec2614ba4469810558
[root@docker01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos82_nginx      v1                  b5f6155f2389        7 seconds ago       313MB

2.运行测试镜像
[root@docker01 ~]# docker run -itd -p 80:80 centos82_nginx:v1 nginx -g 'daemon off;'
4bd852eb2289901efba6c537c6803009f6ebae8d6d1e28016330d0994a7b7e94

3.访问

手动制作Docker镜像及dockerfile初步入门(五)_docker_03

1.3.手动构建nginx+ssh镜像

这次我们采用centos6.9作为系统底层

1.3.1.配置centos6.9容器

1.运行一个空的容器
[root@docker01 ~]# docker run -itd centos:6.9 
4291df5ab92dfd46d27fb5f756158c51318db5ab7a513e8b2b646613a4d29532
[root@docker01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4291df5ab92d        centos:6.9          "/bin/bash"         3 seconds ago       Up 3 seconds                            hopeful_edison

2.进入容器
[root@docker01 ~]# docker exec -it hopeful_edison /bin/bash

3.配置yum仓库
[root@4291df5ab92d /]# rm -rf /etc/yum.repos.d/*
[root@4291df5ab92d /]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo ;curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

4.安装ssh、nginx服务
[root@4291df5ab92d /]# yum -y install nginx openssh-server passwd lrzsz vim

5.启动服务
ssh第一次启动会生成3对密钥用来远程连接,密钥存放在/etc/ssh
[root@4291df5ab92d /]# /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  ]
[root@4291df5ab92d /]# /etc/init.d/nginx start
Starting nginx:                                            [  OK  ]

6.由于要让容器运行时启动两个服务,并且最后一个服务要一直夯住也就是停留在终端,因此我们要写一个启动脚本,运行镜像时指定脚本即可
[root@3b6a5176ebd2 ~]# cat init.sh 
#!/bin/bash
/etc/init.d/sshd start
nginx -g 'daemon off;'

1.3.2.提交容器为镜像

1.提交容器为镜像
[root@docker01 ~]# docker commit hopeful_edison centos69_nginx_ssh:v1 
sha256:7fcf3792254968fc6249b806639eb3b08b2a364ea1df9ed02bc0a7b47fd5bdf8
[root@docker01 ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
centos69_nginx_ssh   v1                  7fcf37922549        5 seconds ago       488MB

2.测试并运行镜像
启动时指定两个服务分别映射的端口和启动服务的脚本
[root@docker01 ~]# docker run -it -d -p 80:80 -p 2222:22 centos69_nginx_ssh:v1 /bin/bash /root/init.sh
3b6a5176ebd2f01d688f07816fc07b3812cfa59faa186fc470cd46be60e95623
[root@docker01 ~]# docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                                      NAMES
3b6a5176ebd2        centos69_nginx_ssh:v1   "/bin/bash /root/ini…"   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp, 0.0.0.0:2222->22/tcp   keen_haslett

3.测试
[root@docker01 ~]# curl -I 192.168.81.210
HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 25 Jun 2020 09:05:18 GMT
Content-Type: text/html
Content-Length: 3698
Last-Modified: Tue, 07 May 2019 06:09:40 GMT
Connection: keep-alive
ETag: "5cd12124-e72"
Accept-Ranges: bytes

[root@docker01 ~]# ssh 192.168.81.210 -p 2222
The authenticity of host '[192.168.81.210]:2222 ([192.168.81.210]:2222)' can't be established.
RSA key fingerprint is SHA256:dj5jl/rpWB82pYSvnrWr4eZTJt1dxEfUX5MbuinM1Eg.
RSA key fingerprint is MD5:06:ec:4a:13:3d:92:5f:5f:70:7c:62:37:9d:18:c6:d8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.81.210]:2222' (RSA) to the list of known hosts.
root@192.168.81.210's password: 
[root@3b6a5176ebd2 ~]# exit 
logout
Connection to 192.168.81.210 closed.

2.利用dockerfile自动构建镜像

2.1.dockerfile简介

dockerfile主要组成部分

​ 1.基础镜像信息 FROM centos:6.9

​ 即使镜像不存在只要镜像名称和版本对了会去docker官方下载

​ 2.制作镜像操作指令 RUN yum -y install openssh-server

​ 3.容器启动时执行的指令 CMD ["/bin/bash"]

dockfile语法格式

​ 基础镜像信息,也就是基于哪个镜像去构建:FROM 镜像名:版本

​ 制作容器操作指令,制作镜像是需要用到的命令:RUN 命令

​ 传输文件:ADD 本地文件路径 容器文件路径

​ 容器启动时执行的指令,也就是docker run运行容器时默认的操作命令:CMD [“命令”,“参数1”,“参数2”]

创建dockerfile时文件名称一定要叫dockerfile

2.2.自动构建ssh镜像

1.创建ssh dockerfile存放目录
[root@docker01 ~]# mkdir /etc/dockerfile
[root@docker01 ~]# cd /etc/dockerfile
[root@docker01 dockerfile]# mkdir centos69_ssh
[root@docker01 dockerfile]# cd centos69_ssh

2.编写dockerfile内容
[root@docker01 centos69_ssh]# vim dockerfile
FROM centos:6.9

RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo ;curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN yum -y install openssh-server
RUN /etc/init.d/sshd start
RUN echo redhat | passwd --stdin root

CMD ["/usr/sbin/sshd","-D"]

3.运行dockerfile自建镜像
[root@docker01 centos69_ssh]# docker build -t centos69_ssh_df:v2 .
............
Successfully built aea6ac3ac89c
Successfully tagged centos69_ssh_df:v2

4.查看镜像
[root@docker01 centos69_ssh]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
centos69_ssh_df      v2                  aea6ac3ac89c        7 seconds ago       367MB

5.运行镜像并验证
[root@docker01 centos69_ssh]# docker run -d -p 3333:22 centos69_ssh_df:v2 
3229194bcca16e0fe82e35c9c59e5ed1418092f21f31548edd14fa4022a1ed92
[root@docker01 centos69_ssh]# ssh 192.168.81.210 -p3333
root@192.168.81.210's password: 
[root@3229194bcca1 ~]# exit



6.扩展
dockerfile中的CMD还可以换种写法,利用ADD指令,将运行指令搞成执行脚本
[root@docker01 centos69_ssh]# cat dockerfile 
FROM centos:6.9

RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo ;curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN yum -y install openssh-server
RUN /etc/init.d/sshd start
RUN echo redhat | passwd --stdin root
ADD init.sh /root/init.sh

CMD ["/bin/bash","/root/init.sh"]

手动制作Docker镜像及dockerfile初步入门(五)_centos_04

2.3.自动构建ssh+nginx镜像

1.创建dockerfile目录
[root@docker01 dockerfile]# mkdir centos69_ssh_nginx
[root@docker01 dockerfile]# cd centos69_ssh_nginx

2.编写dockerfile
[root@docker01 centos69_ssh_nginx]# vim dockerfile
FROM centos:6.9
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo ;curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN yum -y install openssh-server nginx vim lrzsz passwd
RUN /etc/init.d/sshd start
RUN /etc/init.d/nginx start
RUN echo redhat | passwd --stdin root
ADD init.sh /root/init.sh
CMD ["/bin/bash","/root/init.sh"]

3.编写启动脚本
[root@docker01 centos69_ssh_nginx]# vim init.sh
#!/bin/bash
/etc/init.d/sshd start
nginx -g 'daemon off;'

4.运行dockerfile自建镜像
[root@docker01 centos69_ssh_nginx]# docker build -t centos69_ssh_nginx_df:v1 .
........
Successfully built 29e8ca789370
Successfully tagged centos69_ssh_nginx_df:v1

5.查看镜像
[root@docker01 centos69_ssh_nginx]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED              SIZE
centos69_ssh_nginx_df   v1                  29e8ca789370        About a minute ago   488MB

6.运行镜像
[root@docker01 centos69_ssh_nginx]# docker run -d -p 85:80 -p 2022:22 centos69_ssh_nginx_df:v1 
ad29713f993190e18104c73d297b2236be9e4ffd327446882e7d5b6f11d7703a

7.检测
[root@docker01 centos69_ssh_nginx]#  docker run -d -p 85:80 -p 2022:22 centos69_ssh_nginx_df:v1 
a8f9077a126cf2aa0b76944f5082d3f6dbc7e611651c6b809aca783aa633d55d
[root@docker01 centos69_ssh_nginx]# curl -I 192.168.81.210:85
HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 25 Jun 2020 10:39:56 GMT
Content-Type: text/html
Content-Length: 3698
Last-Modified: Tue, 07 May 2019 06:09:40 GMT
Connection: keep-alive
ETag: "5cd12124-e72"
Accept-Ranges: bytes

[root@docker01 centos69_ssh_nginx]# ssh 192.168.81.210 -p2022
root@192.168.81.210's password: 
[root@a8f9077a126c ~]# 

第二次执行会很快原因是有缓存

手动制作Docker镜像及dockerfile初步入门(五)_bash_05