Docker基础操作

发布于:2024-10-17 ⋅ 阅读:(39) ⋅ 点赞:(0)

文章目录

一、安装Docker

yum install -y yum-utils device-mapper-persistent-data lvm2 
#设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
#安装 Docker-CE并设置为开机自动启动
yum install -y docker-ce docker-ce-cli containerd.io
vi /etc/docker/daemon.json
{
    "registry-mirrors": [ "https://8a15142ab6504da8a767986da6e1ce1a.mirror.swr.myhuaweicloud.com" ]
}
systemctl start docker.service
systemctl enable docker.service 

在这里插入图片描述
在这里插入图片描述

二、Docker镜像操作

1.搜索镜像 docker search

格式:docker search 关键字

docker search nginx

2.获取镜像 docker pull

格式:docker pull 仓库名称[:标签]
#如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。

docker pull nginx

3.查看镜像信息 docker images

镜像下载后存放在 /var/lib/docker 。
Docker 相关的本地资源存放在 /var/lib/docker/ 目录下,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件。
#查看下载的镜像文件信息

cat /var/lib/docker/image/overlay2/repositories.json

#查看下载到本地的所有镜像

docker images

在这里插入图片描述

4.获取镜像/容器 详细信息 docker inspect

格式:docker inspect 镜像ID号

docker inspect eeb6ee3f44bd

在这里插入图片描述

5.为本地的镜像添加新的标签 docker tag

格式:docker tag 名称:[标签] 新名称:[新标签]

docker tag nginx:latest nginx:latest2

在这里插入图片描述

6.删除镜像 docker rmi

格式:
docker rmi 仓库名称:标签

docker rmi nginx:latest2

在这里插入图片描述
或者
docker rmi 镜像ID号

docker rmi 7f553e8bbc89

在这里插入图片描述

7.将镜像保存成为本地文件 docker save -o

格式:docker save -o 存储文件名 存储的镜像

docker save -o nginx nginx:latest

在这里插入图片描述

8.将镜像文件导入到镜像库中 docker load -i

格式:
docker load < 存出的文件
或者
docker load -i 存出的文件

docker load -i nginx

在这里插入图片描述

三、Docker容器操作

1.创建容器 docker create

格式:docker create [选项] 镜像
常用选项:
-i:让容器开启标准输入
-t:让 Docker 分配一个伪终端 tty
-it :合起来实现和容器交互的作用,运行一个交互式会话 shell

docker create -it nginx:latest /bin/bash

在这里插入图片描述

2.查看容器的运行状态 docker ps

docker ps -a			#-a 选项可以显示所有的容器

在这里插入图片描述

docker ps               #显示存活容器

在这里插入图片描述

3.启动容器 docker start

格式:docker start 容器的ID/名称

docker start a4d6df04097e

在这里插入图片描述

4.创建并启动容器 docker run

可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。
注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。

docker run centos:7 /usr/bin/bash -c ls /
docker ps -a					#会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了

在后台持续运行 docker run 创建的容器
需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。

docker run -itd centos:7 /usr/bin/bash

在这里插入图片描述

5.终止容器运行 docker stop

格式:docker stop 容器的ID/名称

docker stop 5b1c9d855359

在这里插入图片描述

6.容器的进入 docker exec -it

格式:docker exec -it 容器ID/名称 /bin/bash

docker exec -it cb0d89f7d87f18a45b4f6cad229337fd11478936e2abcbcd18ad44fce736480b /bin/bash
exit
docker run -it centos:7 bash      #不加 -d 选项会创建容器后直接进入容器,但是退出容器,容器也会停止

在这里插入图片描述

7.容器文件复制 docker cp

宿主机的文件传入到容器内部

docker cp /root/index.html test:/opt

在这里插入图片描述
从容器复制文件到主机(在主机位置做)

docker cp test:/opt/index.html /opt

在这里插入图片描述

8.查看容器占用系统资源信息 docker stats

在这里插入图片描述

9.容器的导出与导入 docker export ,docker import

容器的导出
#导出格式:docker export 容器ID/名称 > 文件名

docker export b1d7540146cd > centos7.tar

容器的导入
#导入格式:cat 文件名 | docker import – 镜像名称:标签

docker import centos7.tar centos7:test2

在这里插入图片描述

10.删除容器 docker rm

格式:docker rm [-f] 容器ID/名称

docker rm 38f1c0cbbca9

在这里插入图片描述
批量停止容器

docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash

#批量删除所有容器

docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash

批量删除镜像

docker images | awk 'NR>=2{print "docker rmi "$3}'| bash          # $3是镜像id

批量清理后台停止的容器

docker rm $(docker ps -a -q)		#批量清理后台停止的容器,-q只显示容器id

11.清理 Docker 系统产生的不再需要的资源 docker system prune -a

docker system prune -a

在这里插入图片描述

12.查看容器日志命令

docker logs [OPTIONS] CONTAINER

---------------------------------------------------------------------------
[OPTIONS]
-f : 跟踪日志输出
 
-t : 显示时间戳
 
--tail :仅列出最新N条容器日志
 
--since:显示某个日期至今的所有日志

CONTAINER
代表容器ID或容器名称
查看最近10条日志, 并持续打印
docker logs -f --tail 10 efb78392fcc6
查看某个日期至今的所有日志, 并持续打印
docker logs -f --since "2022-05-16" efb78392fcc6

四、Docker 网络

1.Docker 的网络模式:

●Host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
●Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
●None:该模式关闭了容器的网络功能。
●Bridge:默认为该模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat 表配置与宿主机通信。
●自定义网络

2.Docker网络实现原理

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。

Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

docker run -d --name test1 -P nginx					#随机映射端口(从32768开始)
docker run -d --name test2 -p 43000:80 nginx		#指定映射端口

3.网络模式详解:

1.host模式
相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。
Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。
一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、iptable规则等都与其他的Network Namespace隔离。 一个Docker容器一般会分配一个独立的Network Namespace。 但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。

2.container模式
在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

docker run -itd --name test2 --net=container:3ed82355f811 centos:7 /bin/bash   #3ed82355f811指定共享网络的容器id

3.none模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息。这种网络模式下容器只有lo回环网络,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

4.bridge模式
bridge模式是docker的默认网络模式,不用–net参数,就是bridge模式。
相当于Vmware中的 nat 模式,容器使用独立network Namespace,并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。

(1)当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

(2)从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。

(3)Docker将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0(容器的网卡),另一端放在主机中, 以 * 这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以通过 brctl show 命令查看。veth

(4)使用 docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL 查看。

5.自定义网络

//创建自定义网络
#可以先自定义网络,再使用指定IP运行docker

docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1"  mynetwork
----------------------------------------------------------------------------------------------------------
#docker1 为执行 ifconfig -a 命令时,显示的网卡名,如果不使用 --opt 参数指定此名称,那你在使用 ifconfig -a 命令查看网络信息时,看到的是类似 br-110eb56a0b22 这样的名字,这显然不怎么好记。
#mynetwork 为执行 docker network list 命令时,显示的bridge网络模式名称。
----------------------------------------------------------------------------------------------------------
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash

五、资源控制

cgroups,是一个非常强大的linux内核工具,他不仅可以限制被 namespace 隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups(Control groups)实现了对资源的配额和度量。

cgroups有四大功能:
●资源限制:可以对任务使用的资源总额进行限制
●优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
●资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
●任务控制:cgroup可以对任务执行挂起、恢复等操作

1.设置CPU使用率上限

docker run -itd --name a1 --cpu-quota 50000 centos:7 /bin/bash   #先设置限制--cpu-quota 50000 然后启动
cd /sys/fs/cgroup/cpu/docker/904924b6d70ebcb003fc908b7c2135eee28f5e43f942aa8324072c8f3c9a2634/
cat cpu.cfs_quota_us 
-1

cat cpu.cfs_period_us 
100000

#cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默认为100000。
#cpu.cfs_quota_us:表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。
如果设为50000,表示占用50000/100000=50%的CPU。

在这里插入图片描述
在这里插入图片描述

设置CPU资源占用比(设置多个容器时才有效)

docker run -itd --name c1 --cpu-shares 512 centos:7	
docker run -itd --name c2 --cpu-shares 1024 centos:7

设置容器绑定指定的CPU

docker run -itd --name test7 --cpuset-cpus 1,3 centos:7 /bin/bash

2.对内存使用的限制

//-m(--memory=) 选项用于限制容器可以使用的最大内存
docker run -itd --name test8 -m 512m centos:7 /bin/bash

3.对磁盘IO配额控制(blkio)的限制

–device-read-bps:限制某个设备上的读速度bps(数据量),单位可以是kb、mb(M)或者gb。

docker run -itd --name test9 --device-read-bps /dev/sda:1M  centos:7 /bin/bash

–device-write-bps : 限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb。

docker run -itd --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash

–device-read-iops :限制读某个设备的iops(次数)

–device-write-iops :限制写入某个设备的iops(次数)

4.如果docker日志占用过大,可以使用脚本清除

1、清楚日志

#!/bin/bash
logs=$ (find /var/lib/docker/containers/ -name *-json.log*)
for log in $logs
do
cat /dev/null > $log
done

2、当日志占满之后如何处理
###设置docker日志文件数量及每个日志大小

 vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
"log-driver": "json-file",
"log-opts": { "max-size" : "500m", "max-file" : "3"}   
}

---------------------------------------------------------------------------
"log-driver": "json-file",                                           #我的一日志格式
"log-opts": { "max-size" : "500m", "max-file" : "3"}  #日志的参数最大500M   我最大容器中有三个日志文件 每个日志文件大小是500M

修改完需要重新加载 systemctl daemon-reload

六、Docker 的数据管理

1.数据卷

数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于 Linux 下对目录进行的 mount 操作。

docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
-v /var/www:/data1 将宿主机的 /var/www 目录挂载到容器内的 /data1 目录。
ls
echo "this is web1" > /data1/abc.txt
exit
#返回宿主机进行查看
cat  /var/www/abc.txt

2.数据卷容器

如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。
#创建一个容器作为数据卷容器

docker run --name web2 -v /data1 -v /data2 -it centos:7 /bin/bash
echo "this is web2" > /data1/abc.txt
echo "THIS IS WEB2" > /data2/ABC.txt

宿主机是没有/data1和/data2这两个目录的,是由容器对外提供的两个目录

#使用 --volumes-from 来挂载 web2 容器中的数据卷到新的容器

docker run -it --volumes-from web2 --name web3 centos:7 /bin/bash
cat /data1/abc.txt
cat /data2/ABC.txt

在这里插入图片描述

3.端口映射

在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务。端口映射机制将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。

docker run -d --name test1 -P nginx					#随机映射端口(从32768开始)

docker run -d --name test2 -p 43000:80 nginx		#指定映射端口

4.容器互联

容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。

docker run -itd -p 4200:80 --name c1 centos:7 /bin/bash	
docker run -itd -P --name c2 --link c1:c1 centos:7 /bin/bash
docker exec -it c2 bash
ping c1

在这里插入图片描述

七、Docker 镜像的创建(将容器转为镜像)

1.基于现有镜像创建

(1)首先启动一个镜像,在容器里做修改

docker create -it centos:7 /bin/bash

docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS    PORTS     NAMES
000550eb36da   centos:7   "/bin/bash"   3 seconds ago   Created             gracious_bassi

(2)然后将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像

docker commit -m "new" -a "centos"  7debcc1e91df centos:test
#常用选项:
-m 说明信息;
-a 作者信息;
-p 生成过程中停止容器的运行。

docker images

在这里插入图片描述

2.基于本地模板创建

通过导入操作系统模板文件可以生成镜像,模板可以从 OPENVZ 开源项目下载,下载地址为

http://openvz.org/Download/template/precreated

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

-----------------------------------------------------------------------------------------------
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz -o /opt/1.txt
-o 指定保存路径的文件

#导入为镜像

cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test

3.基于Dockerfile 创建(重点)

Dockerfile 操作常用的指令:
(1)FROM 镜像
指定新镜像所基于的基础镜像,第一条指令必须为FROM 指令,每创建一个镜像就需要一条 FROM 指令

(2)MAINTAINER 名字
说明新镜像的维护人信息

(3)RUN 命令
在所基于的镜像上执行命令,并提交到新的镜像中

(4)ENTRYPOINT [“要运行的程序”, “参数 1”, “参数 2”]
设定容器启动时第一个运行的命令及其参数。
可以通过使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容。

ENTRYPOINT ["rm", "-rf", "/*"]

(5)CMD [“要运行的程序”, “参数1”, “参数2”]
上面的是exec形式,shell形式:CMD 命令 参数1 参数2
启动容器时默认执行的命令或者脚本,Dockerfile只能有一条CMD命令。如果指定多条命令,只执行最后一条命令。
如果在docker run时指定了命令或者镜像中有ENTRYPOINT,那么CMD就会被覆盖。
CMD 可以为 ENTRYPOINT 指令提供默认参数。

ENTRYPOINT ["rm"]
CMD ["cp" ,"-rf",“*”]       #无效
docker run指定的命令----》ENTRYPOINT---》CMD

(6)EXPOSE 端口号
指定新镜像加载到 Docker 时要开启的端口 EXPOSE 8090

(7)ENV 环境变量 变量值
设置一个环境变量的值,会被后面的 RUN 使用

linxu PATH=$PATH:/opt
ENV PATH $PATH:/opt

(8)ADD 源文件/目录 目标文件/目录(自动解压)
将源文件复制到镜像中,源文件要与 Dockerfile 位于相同目录中,或者是一个 URL
有如下注意事项:
1、如果源路径是个文件,且目标路径是以 / 结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。
如果目标路径不存在,则会自动创建目标路径。

/home/ky26/zhaichen.txt    /home/ky26/

2、如果源路径是个文件,且目标路径是不以 / 结尾,则docker会把目标路径当作一个文件。
如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;
如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。
如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。 注意,这种情况下,最好显示的以 / 结尾,以避免混淆。

A(包含ky26文件夹)                B (不包含ky26文件夹)
/home/ky26       				/home/ky26/  

3、如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。
如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下。

4、如果源文件是个归档文件(压缩文件),则docker会自动帮解压。
URL下载和解压特性不能一起使用。任何压缩文件通过URL拷贝,都不会自动解压。

(9)COPY 源文件/目录 目标文件/目录
只复制本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile 在相同的目录中

add和copy命令的区别
1.add命令可自动解压,copy不能
2.add可以用url下载文件
3.都可以进行本地复制文件到容器目标目录内

(10)VOLUME [“目录”]
在容器中创建一个挂载点

(11)USER 用户名/UID
指定运行容器时的用户

(12)WORKDIR 路径 /home
为后续的 RUN、CMD、ENTRYPOINT 指定工作目录

(13)ONBUILD 命令
指定所生成的镜像作为一个基础镜像时所要运行的命令。
当在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响。
但是当编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。

OBuild rm - rf /*

注:请各位自己在生产中如果有的是别的dockerfile 请自习阅读,否则后果自付

(14)HEALTHCHECK
健康检查


在编写 Dockerfile 时,有严格的格式需要遵循:
●第一行必须使用 FROM 指令指明所基于的镜像名称;
●之后使用 MAINTAINER 指令说明维护该镜像的用户信息;
●然后是镜像操作相关指令,如 RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。
●最后使用 CMD 指令指定启动容器时要运行的命令操作。

八、Dockerfile 案例

1.构建Apache镜像

#建立工作目录
mkdir  -p /opt/docker/apache
cd  /opt/docker/apache

vim Dockerfile
#基于的基础镜像
FROM centos:7
#维护镜像的用户信息
MAINTAINER apache image yy
#修改yum源为阿里源
ADD CentOS-Base.repo /etc/yum.repos.d/
#镜像操作指令安装apache软件
RUN yum clean all && yum makecache
RUN yum -y install httpd
#开启 80 端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
//方法一(后台启动apache):
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]
//方法二:
ENTRYPOINT [ "/usr/sbin/apachectl" ]
CMD ["-D", "FOREGROUND"]
//方法三:
CMD /usr/sbin/apachectl -D FOREGROUND

在这里插入图片描述

所有要添加的文件都要放入对应dockerfile的文件夹内
在这里插入图片描述

//方法一:准备执行脚本
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*							#清理httpd的缓存
/usr/sbin/apachectl -D FOREGROUND			#指定为前台运行
#因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。
//准备网站页面
echo "this is test web" > index.html

//生成镜像
docker build -t httpd:centos .   		#httpd:centos是自己创建的名字和标签。注意别忘了末尾有"."

//新镜像运行容器
docker run -d -p 8010:80 httpd:centos

//测试
http://192.168.44.10:8010/

如果有网络报错提示

[Warning] IPv4 forwarding is disabled. Networking will not work.

解决方法:
vim /etc/sysctl.conf
net.ipv4.ip_forward=1

sysctl -p
systemctl restart network
systemctl restart docker

在这里插入图片描述
在这里插入图片描述

2.构建SSH镜像

mkdir  /opt/docker/sshd
cd /opt/docker/sshd

vim Dockerfile
#第一行必须指明基于的基础镜像
FROM centos:7
#作者信息
MAINTAINER ssh image yy
#修改yum源为阿里源
ADD CentOS-Base.repo /etc/yum.repos.d/
#镜像的操作指令
RUN yum clean all && yum makecache
RUN yum -y install epel-release openssh* net-tools lsof telnet passwd
RUN echo 'root' | passwd --stdin root
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config						#不使用PAM认证
RUN sed -ri '/^session\s+required\s+pam_loginuid.so/ s/^/#/' /etc/pam.d/sshd	#取消pam限制
RUN ssh-keygen -t rsa -A														#生成密钥认证文件
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh   #保存密钥的目录
EXPOSE 22
CMD ["/usr/sbin/sshd" , "-D"]			#/usr/sbin/sshd -D 用于前台启动sshd服务


//生成镜像
docker build -t sshd:centos .

//启动容器并修改root密码
docker run -d -P sshd:centos
docker ps -a
ssh localhost -p 49155