Docker

第一章 Docker介绍

1.1 什么是容器?

参考链接:
https://www.cnblogs.com/qianzhengkai/p/11421602.html

1.2 传统虚拟化与容器的区别

1.2.1 Docker优势

启动非常快,秒级实现
资源利用率高,一台高配置服务器可以跑上千个docker容器
更快的交付和部署,一次创建和配置后,可以在任意地方运行
内核级别的虚拟化,不需要额外的hypevisor支持,会有更高的性能和效率
易迁移,平台依赖性不强

1.2.2 Docker核心概念

镜像,是一个只读的模板,类似于安装系统用到的那个iso文件,我们通过镜像来完成各种应用的部署。
容器,镜像类似于操作系统,而容器类似于虚拟机本身。它可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。
仓库,存放镜像的一个场所,仓库分为公开仓库和私有仓库。 最大的公开仓库是Docker hub(hub.docker.com),国内公开仓库(dockerpool.com)

1.3 容器的前世

FreeBASE jail ----> Linux vserver
chroot --->负责保证有完成的标准根文件系统(FHS)
namespace--->UTS Mount IPC PID user network
cgroup--->资源的分配和监控
通过比较复杂的代码开发的过程,调用以上三项技术
实现容器的创建--->管理--->销毁

容器技术最早出现在FreeBSD上叫做 jail,将一个进程放入jail中运行,不管这个进程在其中发生怎样的错误都不会影响到系统上其他进程的运行
后来,jail技术在Linux中的实现叫做vserver,vserver所实现的功能体现为chroot以及namespaces实现资源的隔离。
容器技术出现的主要目的是为了"资源隔离"

1.4 容器的今生(LXC-->Docker)

LXC(Linuxcontainer),将原来需要手工编码实现的容器技术,进行了封装。实现了,更加方便、快速的容器创建及管理的技术。通过固有“模板”,安装并启动容器。将远程的程序包下载到本地,安装并创建好我们需要的容器。
确实,LXC已经很大程度上降低了容器管理的难度,方便我们做容器的生命周期,但是依然使用一些弊端。有些时候可能需要自定制模板,以及使用LXC中自带的模板,以及大规模创建及复制依然比较麻烦。所以,很难大规模的应用。
所以,出现了Docker技术。Docker是在LXC基础上,使用GoLang二次开发的封装版。

第二章 Docker安装

2.1 环境准备

curl  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

2.2 安装依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2
yum list docker-ce.x86_64 --showduplicates | sort -r

2.3 安装docker-ce

yum install -y --setopt=obsoletes=0 
docker-ce-17.03.2.ce-1.el7.centos.x86_64 
docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch

2.4 启动Docker服务

systemctl daemon-reload
systemctl restart docker
docker version
docker  info

2.5 配置镜像加速

Centos7使用阿里云镜像加速:

https://cr.console.aliyun.com/cn-hangzhou/mirrors
注册账号并复制加速器地址


选择对应的系统并根据自己的docker版本执行相应的步骤;

查看docker版本:docker --version

配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://e5z3ty0n.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

测试结果:

[root@docker:/etc/docker]# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete 
fc878cd0a91c: Pull complete 
6154df8ff988: Pull complete 
fee5db0ff82f: Pull complete 
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest

2.6 Doocker体系结构

第三章 Docker的镜像基础管理

3.0 官方镜像网址

https://hub.docker.com/

3.1 获取镜像

docker search centos  # 搜索镜像
docker pull centos:6.9  # 拉取镜像
docker pull centos:7.5.1804 
docker pull nginx

3.2 查询镜像

docker images # 查看本地的镜像
docker image ls --no-trunc # 镜像详细信息查看
docker images -q  # 只查看镜像ID
docker inspect ID/name:tag # 镜像详细信息查看
例:
[root@docker:~]# docker image inspect ubuntu:latest
[root@docker:~]# docker image inspect ubuntu:1d622ef86b13

3.3 删除镜像

docker rmi  ID 
docker rmi `docker images -q`  #全部删除
docker rmi $(docker images -q)

3.4 导入导出镜像

[root@docker ~]# docker image save 1d622ef86b13 >/opt/nginx.tar.gz  #导出
[root@docker ~]# docker image load -i /opt/ubuntu.tar.gz #导入

3.5 添加标签

docker image tag ID 新标签
例:
[root@docker:~]# docker image tag 1d622ef86b13 ubuntu:lates01 
[root@docker:~]# docker imagels 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              lates01             1d622ef86b13        6 weeks ago         73.8 MB
ubuntu              latest              1d622ef86b13        6 weeks ago         73.8 MB

第四章 Docker容器基础管理

4.1 运行第一个容器

两种启动容器模式:交互式和守护式

4.11 交互式启动

应用场景:
主要是针对于工具类的容器,一旦exit容器,容器就自动关闭

[root@docker:~]# docker container run -it --name="test_ubuntu" 1d622ef86b13 /bin/bash  
# -i 交互式 -t新开一个终端 --name手工指定名字
root@8ad4385147c2:/#
[root@docker:~]# docker container ls  #查看正在运行的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8ad4385147c2        1d622ef86b13        "/bin/bash"         3 minutes ago       Up 3 minutes                            test_ubuntu

[root@docker:~]# docker container ls -a  #查看所有的容器的状态,包括运行和退出状态的

ps:
CONTAINER ID :容器的唯一号码(自动生成的)
NAMES        : 容器的名字(可以自动,也可以手工指定)
STATUS       :容器的运行状态(Exited,up)

4.12 守护式启动

主要是针对于服务类的容器

[root@docker:~]# docker run -d --name="nsthink_nginx" nginx:1.14  #守护式启动
Unable to find image 'nginx:1.14' locally  #本地没有镜像会自动下载
1.14: Pulling from library/nginx
27833a3ba0a5: Pull complete 
0f23e58bd0b7: Pull complete 
8ca774778e85: Pull complete 
Digest: sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
Status: Downloaded newer image for nginx:1.14
a18d38d49943b06897c847f89587944f30a012ba320a3164a2ce68fc02401706

[root@docker:~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
a18d38d49943        nginx:1.14          "nginx -g 'daemon ..."   About a minute ago   Up About a minute   80/tcp              nsthink_nginx
8ad4385147c2        1d622ef86b13        "/bin/bash"              22 minutes ago       Up 22 minutes                           test_ubuntu

[root@docker:~]# docker container inspect nsthink_nginx 
#通过查询容器详细信息查看ip地址
[root@docker:~]# curl -I 172.17.0.3
HTTP/1.1 200 OK

4.13 容器应用场景

交互式的容器:用于工具类的任务,如开发,测试,临时性的任务

docker container run -it --name="nsthink_nginx" --rm a18d38d49943
#当退出nsthink_nginx容器时会自动删除该容器i

守护式容器: 跑服务,如ssh

docker run -d --name="nsthink_nginx" nginx:1.14

4.14 Docker容器启动/关闭/连接

守护式容器的关闭和启动

[root@docker:~]# docker container stop nsthink_nginx
#优雅的停止容器

[root@docker:~]# docker container start nsthink_nginx
#仅仅启动容器,不连接进去,适用于守护式容器

交互式容器的关闭和启动

[root@docker:~]# docker container stop ubuntu
[root@docker:~]# docker container start -i ubuntu

容器的连接方法

[root@docker:~]# docker container attach ubuntu
#不同的终端界面是同步的,退出一个终端其他终端界面也同时退出

docker exec  -i -t  容器ID|容器名称 /bin/bash(服务类),一般是做服务类容器调试用
[root@docker:~]# docker container exec -it ubuntu /bin/bash
#子进程的方式登陆,在已有工作容器中生成子进程,做登陆,可以进行容器的调试,退出时也不会影响到当前容器

容器的其他管理

docker ps -a  -q -l
docker top testxx
docker inspect
ctrl+p+q:将工具类容器丢到后台运行,可以保持会话不中断
docker attach 容器ID|容器名称(工具类)  调回后台运行的容器


制作守护式容器时,常用将容器夯在前台的方法:
问题点:
使用centos镜像以后台模式启动一个容器
​	docker run -d centos
然后执行:
​	docker ps -a 进行查看,发现容器已经退出
很重要的说明一点问题:
​	Docker容器后台运行,就必须要有一个前台进程
​	容器命令如果不是那些一直挂起的命令(比如top,tail) ,就会自动退出
​	这是docker的一个机制,比如web容器,我们以nginx为例,正常情况下,我们配置服务器服务只要启动响应的serveice 即可,例如 : service nginx start
​	但是这样做,nginx 为后台进程模式,就会导致docker前台没有运行的应用。
​	这样容器后台启动后,会立刻自杀因为他觉得没事可做
​	所以最佳的解决办法就是将你要运行的程序以前台进程的形式运行

[root@docker:~]# docker container rm `docker container ls -a -q` 
#停止所有正在运行的容器

#查看docker日志
[root@docker ~]# docker exec -it  centos6.9   /bin/bash
[root@oldboy docker]# docker logs testxx [常用]
[root@oldboy docker]# docker logs -t testxx [常用]
[root@oldboy docker]# docker logs -tf testxx
[root@oldboy docker]# docker logs -tf  --tail 10 testxx
[root@oldboy docker]# docker logs -tf  --tail 0 testxx

4.2 Docker容器的网络访问

指定映射(docker 会自动添加一条iptables规则来实现端口映射)

-p hostPort:containerPort
例:8080为宿主机端口,80为docker端口
[root@docker:~]# docker container run -d -p 8080:80 --name='n1' nginx:1.14 [常用]

-p ip:hostPort:containerPort 
例:将容器的80端口映射到10.0.0.100的8080端口
[root@docker:~]# docker container run -d -p 10.0.0.100:8081:8080:80 --name='n2' nginx:1.14 [常用]

-p hostPort:containerPort –p hostPort:containerPort
例:多个端口映射,适用于多个服务
[root@docker:~]#docker run -d -p 10.0.0.100:33060:3306 -p 2222:22 -p 12345:80 --name="n6" nginx:1.14

-p hostPort:containerPort:udp
[root@docker:~]#docker run -d -p 10.0.0.100:5555:53/udp --name="n5" nginx:1.14

随机映射:

-p ip::containerPort(随机端口)
例:容器80映射到宿主机随机端口(端口范围:32768-60999)
[root@docker:~]#docker run -d -p 80 --name="n3" nginx:1.14
[root@docker:~]#docker run -d -p 10.0.0.200::80 --name="n4" nginx:1.14

4.3 Docker 命令小结

镜像类:

docker image 
search
pull
ls   [常用]
inspect [常用]
rm  [常用]
save
load

容器类:

docker container
run  [常用]
start [常用]
stop [常用]
restart
kill
attach
exec [常用]
ls  [常用]
top [常用]
logs
inspect [常用]

4.4 数据卷实现持久化存储

4.41 需求背景:

 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中

手动拷贝文件至容器

[root@docker:~]#docker container rm -f `docker container ls -a -q`
[root@docker:~]# docker run -d --name="n1" -p 80:80 nginx
[root@docker:~]# docker image ls
[root@docker:~]# mkdir -p opt
[root@docker:~]# cd opt/
[root@docker:~/opt]# ls
[root@docker:~/opt]# vim index.html
[root@docker:~/opt]# pwd

# 从容器内拷贝文件的到宿主机上:docker cp 容器ID:容器内路径 目的主机路径,同理也可以相反
[root@docker:~/opt]# docker container cp n1:/usr/share/nginx/html/index.html  ./

4.42 Volume实现宿主机和容器的数据共享

作用:数据持久化

[root@docker:~]# mkdir -p /opt/html

[root@docker:~]# docker run -d --name="nginx_3" -p 81:80 -v /opt/html/:/usr/share/nginx/html nginx
58a4a9b27f1c900fe55337774e4f61296dd948ad159d890da300b8d4229bc353

[root@docker:~]# docker container exec -it nginx_3 /bin/bash
  其中,-v代表挂载数据卷,这里使用自定数据卷/opt/html/,并且将数据卷挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。
如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载
我们可以访问到容器里面的两个默认页面,由此可知,volume帮我们做的类似于一个软链接的功能。在容器里边的改动,我们可以在宿主机里感知,而在宿主机里面的改动,在容器里边可以感知到。
这时,如果我们手动stop并且remove当前nginx容器,我们会发现容器卷里面的文件还在,并没有被删除掉。
由此可以验证,在数据卷里边的东西是可以持久化的。如果下次还需要创建一个nginx容器,那么还是复用当前数据卷里面的文件。
此外,我们还可以启动多个nginx容器实例,并且共享同一个数据卷,复用性和扩展性较强。

查看某一个容器的数据卷的挂载路径

[root@docker:~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
58a4a9b27f1c        nginx               "/docker-entrypoin..."   27 minutes ago      Up 27 minutes       0.0.0.0:81->80/tcp   nginx_3
[root@docker:/opt/html]# docker container inspect nginx_3
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/opt/html",
                "Destination": "/usr/share/nginx/html",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

例子:开启两个nginx容器(90,91),实现共同挂载一个数据卷,实现静态资源共享

[root@docker:/opt/html]# docker container run -d -p 90:80 --name="nginx_vol01" -v /opt/html:/usr/share/nginx/html nginx
98d04fa46840ef295e969ec45764490dd7f26181a867b16ff860de25ba7a0e1f
[root@docker:/opt/html]# docker container run -d -p 91:80 --name="nginx_vol02" -v /opt/html:/usr/share/nginx/html nginx
d4d3895c3bf3292acac79847b612985d2c5afa73bd1bab25b366cb5e0b5d3178
浏览器网页进行测试:
http://10.0.0.90:91/      http://10.0.0.90:91/ 

4.5 数据卷容器

应用背景:

在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数据卷进行统一管理

宿主机模拟数据

mkdir -p /opt/Volume/a
mkdir -p /opt/Volume/b
touch /opt/Volume/a/a.txt
touch /opt/Volume/b/b.txt

生成数据卷容器

docker run -it --name "nginx_volumes" -v /opt/Volume/a:/opt/a -v /opt/Volume/b:/opt/b centos:6.9 /bin/bash
ctrl p q

拷贝数据到数据卷中

使用数据卷容器

docker run -d -p 8085:80 --volumes-from nginx_volumes --name "http8085" nginx
docker run -d -p 8086:80 --volumes-from nginx_volumes --name "http8086" nginx

测试:进入到8085容器中,查看是否有相应的文件

[root@docker:~]# docker container exec -it http8085 /bin/bash
root@bb9cdf5bf024:/# ls /opt/
a  b  //真实的文件路径在宿主机中/opt/Volume目录下

4.6 本地yum源配置

制作本地局域网yum源
1,安装vsftpd软件

yum install -y vsftpd

2,启动ftp

systemctl enable vsftpd
systemctl start vsftpd

3,上传镜像到本地

4,配置yum仓库

mkdir -p /var/ftp/centos6.9
mkdir -p /var/ftp/centos7.5
mount -o loop /mnt/CentOS-6.9-x86_64-bin-DVD1.iso  /var/ftp/centos6.9/
mount -o CentOS-7-x86_64-DVD-1804.iso /var/ftp/centos7.5

# vim /etc/rc.local
mount -o loop /mnt/CentOS-6.9-x86_64-bin-DVD1.iso /var/ftp/centos6.9
mount -o CentOS-7-x86_64-DVD-1804.iso /var/ftp/centos7.5


windows验证
ftp://10.0.0.90/centos6.9/

cat >/yum.repos.d/ftp_6.repo <<EOF
[ftp]
name=ftpbase
baseurl=ftp://172.16.1.90/centos6.9
enable=1
gpgcheck=0
EOF

cat >/yum.repos.d/ftp_7.repo <<EOF
[ftp]
name=ftpbase
baseurl=ftp://172.16.1.90/centos7.5
enable=1
gpgcheck=0
EOF

第五章 镜像制作

5.1 基于容器的镜像制作(Aliyun ECS)

为了安装软件更快一些,先配置一个本地yum仓库,生产环境下一般配置像阿里云之类的yum源

5.1.1 启动基础镜像容器

docker run -it --name="01-centos" centos:6.9

5.1.2 安装所需软件包

在6.9镜像基础之上做yum源优化:

[root@8f54524b969c ~]#  echo -e "[ftp]
name=ftpbase
baseurl=ftp://172.17.0.1/centos6.9
ngpgcheck=0">/etc/yum.repos.d/ftp_6.repo

#安装所需软件
[root@8f54524b969c ~]# yum makecache fast && yum install openssh-server -y

[root@8f54524b969c ~]# /etc/init.d/sshd start //首次启动会生成密钥对和pam验证配置文件

[root@8f54524b969c ~]# /etc/init.d/sshd stop

[root@8f54524b969c ~]# echo "linux@123" | passwd root --stdin //设置密码
### 5.1.3 镜像的制作
```bash
[root@docker:~]# docker commit 01-centos michaelni/centos6.9_sshd:v1

[root@docker:~]# docker image ls
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
michaelni/centos6.9_sshd   v1                  f011ae877217        44 minutes ago      331 MB
centos                     6.9                 2199b8eb8390        15 months ago       195 MB

5.1.4 基于新镜像启动容器(centos6.9+ssh功能)

[root@docker:~]# docker rm -f `docker ps -a -q`


#映射端口并且将sshd前台运行
[root@docker:~]# docker container run -d --name=sshd_2222 -p 2222:22 f011ae877217 /usr/sbin/sshd -D
24f8e4a9fef2467ba924df5baec7583b997d50ba21daf30a8d25e43a4646d114


5.2 构建企业镜像(Centos6.9_SSHD_LAMP_BBS)

5.2.1 启动基础镜像

#删除所有容器
[root@docker:~]# docker container rm -f `docker ps -a -q`

#创建mysql数据目录与网站代码数据目录
[root@docker:~]# rm -rf /opt/*      
[root@docker:~]# mkdir -p /opt/vol/mysql /opt/vol/html

#启动容器并挂载数据卷
[root@docker:~]# docker run -it --name="nsthink_centos_bbs" -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html centos:6.9

5.2.2 优化yum源并安装软件

[root@357305d8680a ~]# mv /etc/yum.repos.d/*.repo /tmp
[root@357305d8680a ~]# echo -e "[ftp]
name=ftpbase
baseurl=ftp://172.17.0.1/centos6.9
enable=1
gpgcheck=0">/etc/yum.repos.d/ftp_6.repo 
[root@357305d8680a ~]# yum makecache fast && yum install openssh-server httpd mysql mysql-server php php-mysql -y

### 5.2.3 软件初始化
```bash
#sshd初始化
[root@357305d8680a ~]# /etc/init.d/sshd start //首次启动会生成密钥对和pam验证配置文件
[root@357305d8680a ~]# /etc/init.d/sshd stop
[root@357305d8680a ~]# echo "linux@123" | passwd root --stdin //设置密码

#mysqld初始化数据
[root@357305d8680a ~]# /etc/init.d/mysqld start
此时我们可以看到宿主机目录下/opt/vol/mysql/是有数据的,和/var/lib/mysql文件一致
[root@357305d8680a ~]# mysql
mysql> grant all on *.* to root@'%' identified by 'linux@123';
mysql> grant all on *.* to discuz@'%' identified by 'linux@123';
mysql> create database discuz charset utf8;

#apache初始化数据
[root@357305d8680a ~]# /etc/init.d/httpd start
[root@357305d8680a ~]# curl 172.17.0.2 //测试

5.2.4 制作LAMP第一版基础镜像

[root@docker:~]# docker commit 357305d8680a nsthink/centos_lamp:v1
sha256:5fb30fdcb7324fbc28e8b57a86c9ff1566f948332c9beb699d22da50276c4287

5.2.5 根据第一版镜像启动新容器

[root@docker:~]# docker image ls
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
nsthink/centos_lamp        v1                  5fb30fdcb732        6 minutes ago       415 MB
[root@docker:~]# docker run -it --name="nsthink_centos_bbs_v2" -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html -p 8080:80 5fb30fdcb732

#启动服务
[root@ba9f5110112a /]# /etc/init.d/mysqld start
[root@ba9f5110112a /]# /etc/init.d/httpd start

#访问测试:物理机浏览器上访问http:10.0.0.90:8080

5.2.6 测试php功能

vim /var/www/html/index.php
<?php
phpinfo();
?>
[root@ba9f5110112a /]# http://10.0.0.90:8080/index.php

5.2.7 安装bbs论坛

上传bbs代码到宿主机/opt/vol/html并解压

[root@docker:/usr/local/src]# unzip Discuz_X3.4_SC_UTF8【20191201】.zip

[root@docker:/usr/local/src]# cp -a ./upload/* /opt/vol/html/

[root@docker:~]# docker container ls -a
CONTAINER ID   IMAGE         COMMAND      CREATED      STATUS     PORTS                NAMES
ba9f5110112a   5fb30fdcb732  "/bin/bash"  4 hours ago  Up 4 hours 0.0.0.0:8080->80/tcp nsthink_centos_bbs_v2

5.2.8 制作LAMP+bbs第二版镜像

[root@docker:~]# docker commit nsthink_centos_bbs_v2 nsthink_centos_sshd_lamp_bbs:v1

5.2.9 创建启动脚本

[root@docker:~]# cd /opt/vol/html
[root@docker:/opt/vol/html]# vim init.sh
#!/bin/bash
/etc/init.d/mysqld start
/etc/init.d/httpd start
/usr/sbin/sshd -D
[root@docker:/opt/vol/html]# chmod a+x init.sh

5.2.10 启动容器,映射端口,挂载数据卷,自动启多服务

[root@docker:/opt/vol/html]# docker image ls -a
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
nsthink_centos_sshd_lamp_bbs   v1                  eb0bf4b225fd        2 hours ago         415 MB
nsthink/centos_lamp            v1                  5fb30fdcb732        9 hours ago         415 MB

[root@docker ~]# ocker container run -d --name="msthinkyun_lamp_bbs" -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html -p 22222:22 -p 8888:80 -p 33060:3306 eb0bf4b225fd /var/www/html/init.sh

5.2.11 测试

1,用xhell连接10.0.0.90:22222
2,使用sqlyog测试连接数据库

此时我们完成了通过容器的方式来定制我们的镜像,步骤还是挺复杂的,我们可以所有的步骤写成一个固定模板的一个文件,将来只需要按照这个文件build一下,这个镜像就有了,这就是下一节要介绍的dockfile,只要有基础镜像,只要一条命令,这些命令就不用做了,类似于ansible剧本一样,但是我们还是要对每个步骤很熟悉,才能完成编写dockfile

5.3 centos7.5.1804_sshd

说明:
一般情况下,我们制作的镜像要有ssh服务,起码要能连进去管理,对于centos6中,我们可以提前通过/etc/init.d/sshd start进行软件初始化,但是我们在centos7中,并没有/etc/init.d/sshd这个初始化脚本了,所以一些初始化的动作要手工完成

5.3.1 启动容器:

#pull容器
[root@docker:~]# dockerrun -it --name=c75sshd centos:7.5.1804
#优化yum源
[root@e55cd0a5ef6c /]# mv /etc/yum.repos.d/*.repo /tmp
[root@e55cd0a5ef6c /]# echo -e "[ftp]
name=ftpbase
baseurl=ftp://172.17.0.1/centos6.9
enable=1
gpgcheck=0">/etc/yum.repos.d/ftp_6.repo 
[root@e55cd0a5ef6c /]# yum makecache fast && yum install openssh-server httpd mysql mysql-server php php-mysql -y

5.3.2 软件初始化


[root@e55cd0a5ef6c /]# mkdir /var/run/sshd
[root@e55cd0a5ef6c /]# echo 'UseDNS no' >> /etc/ssh
bash: /etc/ssh: Is a directory
[root@e55cd0a5ef6c /]# echo 'UseDNS no' >> /etc/sshd_config
[root@e55cd0a5ef6c /]# sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd
[root@e55cd0a5ef6c /]# echo 'root:linux@123' | chpasswd
[root@e55cd0a5ef6c /]# /usr/bin/ssh-keygen -A
ssh-keygen: generating new host keys: RSA1 RSA DSA ECDSA ED25519 

5.3.3 制作第二版镜像

[root@docker:~]# docker commit e55cd0a5ef6c nsthink_c75sshd


[root@docker:~]# docker container run -d --name=sshd_2222 -p 222:22 nsthink_c75sshd /usr/sbin/sshd -D
7d8ac1794f0fc869171e8d671dd7693aed1df6dd86e49239d6980a841dc72277


[root@docker:~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                  NAMES
7d8ac1794f0f        nsthink_c75sshd     "/usr/sbin/sshd -D"      2 minutes ago       Up 2 minutes        0.0.0.0:222->22/tcp                                                    sshd_2222
e55cd0a5ef6c        centos:7.5.1804     "/bin/bash"              26 minutes ago      Up 26 minutes                                                                              c75sshd

#查看ip地址
[root@docker:~]# docker container inspect 7d8ac1794f0f


#测试
使用xshell进行连接测试

第六章 通过Dockerfile定制企业镜像

6.1 Dockerfile的基本使用初体验(centos6.9_sshd)

[root@docker:~]# mkdir -p /opt/dockerfile/centos6.9_sshd
[root@docker:~]# docker image ls
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
centos                         6.9                 2199b8eb8390        16 months ago       195 MB

[root@docker:/opt/dockerfile/centos6.9_sshd]# vim dockerfile

# 注释:Centos6.9-SSHDV1.0

FROM centos@2199b8eb8390 
***
语法:
FROM:  基础镜像
    Syntax:
    FROM centos:6.9 (不安全)
    FROM centos@2199b8eb8390 (旧版本docker可能不支持)
***
RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[ftp]
name=ftpbase
baseurl=ftp://172.17.0.1/centos6.9
ngpgcheck=0">/etc/yum.repos.d/ftp_6.repo
 && yum makecache fast && yum install openssh-server -y
#dockerfile中的命令能写到一行就写到一行,这样会尽可能减少临时容器的产生,上面命令默认执行环境为/bin/bash
***
语法:
RUN:  构建镜像过程中运行的命令
    Syntax:
法1: RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[ftp]
name=ftpbase
baseurl=ftp://172.17.0.1/centos6.9
gpgcheck=0">/etc/yum.repos.d/ftp_6.repo
 && yum makecache fast && yum install openssh-server -y 
法2(针对非shell命令): 
     RUN ["mysqld","--initialize-insecure","--user=mysql","--basedir=/usr/local/musql","--datadir=/data/mysql/data"]           
***

RUN /etc/init.d/sshd start && /etc/init.d/sshd stop && echo "linux@123" | passwd root --stdin

EXPOSE 22 #向外暴露22端口

***
CMD: 使用镜像启动容器时运行的命令,一般守护式容器必加的
***

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


[root@docker:/opt/dockerfile/centos6.9_sshd]#  docker image build -t "nsthink/centos6.9-sshd:v1.0" ./

系统化运维博客
原文地址:https://www.cnblogs.com/nsthink-666/p/13052938.html