Docker 容器的使用和Dockerfile配置ssh服务

欠伸展肢体,吟咏心自愉。这篇文章主要讲述Docker 容器的使用和Dockerfile配置ssh服务相关的知识,希望能为你提供帮助。



1、容器基本操作容器是 Docker 的另一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。
如果认为虚拟机是模拟运行的一整套操作系统(包括内核、 应用运行态环境和其他系统环境)和跑在上面的应用。那么 Docker 容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。
1.1 创建容器

  • 获取centos:7.5.1804的镜像
docker pull centos:7.5.1804

【Docker 容器的使用和Dockerfile配置ssh服务】centos Tags | Docker Hub(??https://hub.docker.com/_/centos?tab=tags& page=2????)

[duo@hadoop01 ~]$ docker pull centos:centos7.5.1804
centos7.5.1804: Pulling from library/centos
5ad559c5ae16: Pull complete
Digest: sha256:7a45e4a1efbaafc1d9aa89925b6fdb33288a96d35ea0581412316e2f0ad3720a
Status: Downloaded newer image for centos:centos7.5.1804
docker.io/library/centos:centos7.5.1804

  • 创建容器
docker create -i -t centos:7.5.1804/bin/bash

[duo@hadoop01 ~]$ docker create -i -t centos:7.5.1804/bin/bash
Unable to find image centos:7.5.1804 locally
7.5.1804: Pulling from library/centos
Digest: sha256:7a45e4a1efbaafc1d9aa89925b6fdb33288a96d35ea0581412316e2f0ad3720a
Status: Downloaded newer image for centos:7.5.1804
c720d3f24d326bc727f468985dae394c7d4b11923d9f5d599e2ccc08aac1ed6f

说明:
  1. 创建一个交互式的容器
  2. -i: 允许你对容器内的标准输入 (STDIN) 进行交互
  3. -t: 在新容器内指定一个伪终端或终端。
  • 启动容器
docker start c720d3f24d32

[duo@hadoop01 ~]$ docker start c720d3f24d32
c720d3f
[duo@hadoop01 ~]$ dcoker ps
bash: dcoker: 未找到命令...
相似命令是:docker
[duo@hadoop01 ~]$ docker ps
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
c720d3f24d32centos:7.5.1804"/bin/bash"About a minute agoUp 8 secondscompetent_diffie

c720d3f 生成唯一ID:??c720d3f24d326bc727f468985dae394c7d4b11923d9f5d599e2ccc08aac1ed6f??中一部分
  • 新建并启动容器
前面的操作是先创建容器, 然后再启动容器. 也可以使用run来直接新建并启动容器
启动一个交互式的centos容器
docker run -it centos:7.5.1804 /bin/bash

[duo@hadoop01 ~]$ docker run -it centos:7.5.1804 /bin/bash
[root@b55484964af2 /]# ll
total 44
lrwxrwxrwx1 root root7 May 312018 bin -> usr/bin
drwxr-xr-x5 root root360 Jan9 08:46 dev
drwxr-xr-x1 root root 4096 Jan9 08:46 etc
drwxr-xr-x2 root root 4096 Apr 112018 home
lrwxrwxrwx1 root root7 May 312018 lib -> usr/lib
lrwxrwxrwx1 root root9 May 312018 lib64 -> usr/lib64
drwxr-xr-x2 root root 4096 Apr 112018 media
drwxr-xr-x2 root root 4096 Apr 112018 mnt
drwxr-xr-x2 root root 4096 Apr 112018 opt
dr-xr-xr-x 223 root root0 Jan9 08:46 proc
dr-xr-x---2 root root 4096 May 312018 root
drwxr-xr-x10 root root 4096 May 312018 run
lrwxrwxrwx1 root root8 May 312018 sbin -> usr/sbin
drwxr-xr-x2 root root 4096 Apr 112018 srv
dr-xr-xr-x13 root root0 Jan9 08:43 sys
drwxrwxrwt7 root root 4096 May 312018 tmp
drwxr-xr-x13 root root 4096 May 312018 usr
drwxr-xr-x18 root root 4096 May 312018 var

说明:
  1. 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
  2. 利用镜像创建一个容器,并启动该容器;
分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
  • 查看有哪些容器
  1. 查看所有容器
docker ps -a

  • 启动后台进程
docker run -itd centos:7.5.1804 /bin/bash

1.2 停止容器
docker stop c720d3f24d32

1.3 进入容器在使用 -d 参数时,容器启动后会进入后台(有些容器默认就是后台, 比如centos容器)。此时想要进入容器,可以通过以下指令进入:
docker exec -it bcc /bin/bash

通过指定 -it参数来保持标准输入打开, 并且分配一个伪终端。可以看到会打开一个新的 bash 终端,在不影响容器内其他应用的前提下,用户可以与容器进行交五。
1.4 删除容器
  • 删除已经停止的容器
docker rm ea5c

[duo@hadoop01 ~]$ docker ps -a
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
b55484964af2centos:7.5.1804"/bin/bash"34 seconds agoExited (0) 11 seconds agokeen_lovelace
c720d3f24d32centos:7.5.1804"/bin/bash"12 minutes agoUp 11 minutescompetent_diffie
[duo@hadoop01 ~]$ docker rm b55484964af2
b55484964af2
[duo@hadoop01 ~]$ docker ps -a
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
c720d3f24d32centos:7.5.1804"/bin/bash"13 minutes agoUp 12 minutescompetent_diffie

  • 删除正在运行的容器:先停止, 再删除
docker rm -f bcc

1.5 导入和导出容器某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用 Docker 的导人 和导出功能,这也是 Docker 自身提供的一个重要特性。
为了测试容器是否导出和导入成功, 我们在centos容器中创建一个新的文件
[duo@hadoop01 ~]$ docker exec -it 1032 /bin/bash
[root@1032de803222 /]# ls
bindevdocker.txtetchomeliblib64mediamntoptprocrootrunsbinsrvsystmpusrvar

1.5.1 导出容器
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态.
docker export -o /docker-centos.tar 1032


可以把导出的tar文件, 传输到其他设备, 再通过导入命令导入, 实现容器的迁移.
1.5.2 导入容器
将上节导出的容器导入之后会成为镜像.


docker import docker-centos.tar -- test/mycentos:0.0.1

使用新的镜像启动容器:刚才创建的文件还在
1.6 查看容器1.6.1 查看容器详情
docker container inspect 9fa

会以 json 格式返回包括容器 Id、创建时间、路径、状态、镜像、配置等在内的各项信息

1.6.2 查看容器内进程
docker top 103

这个子命令类似于 Linux 系统中的 top 命令, 会打印出容器内的进程信息, 包括 PID 、 用户、时间、命令等
1.6.3 查看统计信息
docker stats --no-stream 103

会显示 CPU 、内存、存储、网络等使用情况的统计信息



[duo@hadoop01 /]$ docker stats --no-stream 103
CONTAINER IDNAMECPU %MEM USAGE / LIMITMEM %NET I/OBLOCK I/OPIDS
1032de803222sharp_mestorf0.00%380KiB / 8.951GiB0.00%62kB / 0B0B / 0B1

1.7 容器和主机之间复制文件容器和主机之间进行文件复制的时候, 要保证容器已经启动.
1.7.1 从主机复制到容器
docker cp 123.log c72:/

[duo@hadoop01 ~]$ docker cp 123.log c72:/
[duo@hadoop01 ~]$ docker exec -it c72 /bin/bash
[root@c720d3f24d32 /]# ls
123.logbindev

1.7.2 从容器复制到主机
[duo@hadoop01 ~]$ docker cp c72:/123.log ./456.log
[duo@hadoop01 ~]$ ls
123.log公共视频文档音乐456.log

2、镜像高级操作2.1 创建镜像创建镜像的方法主要有2种:
  • 基于已有容器创建。
  • 基于Dockerfile 创建
2.1.1 基于已有容器创建
docker commit -m add new file : a.txt -a duo9fanew_centos:1.0

说明:
  1. -m 提交信息
  2. -a   作者
  3. 9fa   旧有的容器
  4. new_centos:1.0 新的镜像
2.1.2 基于Dockerfile 创建
基于 Dockerfile 创建是最常见的方式。Dockerfile 是一个文本文件, 利用给定的指令描述基于某个父镜像创建新镜像的过程。
下面使用Dockerfile创建一个基于centos的java开发环境:
  • 新建目录:mkdir ./dockerfile_jdk
  • 把jdk安装转包copy到 ./dockerfile_jdk目录下
cp jdk-8u212-linux-x64.tar.gz ./dockerfile_jdk

  • 创建Dockerfile文件
FROM centos:7.5.1804
RUN mkdir -p /data/software
RUN mkdir -p /data/module
COPY jdk-8u212-linux-x64.tar.gz /data/software/
RUN tar -zxvf /data/software/jdk-8u212-linux-x64.tar.gz -C /data/module
RUN rm -rf /data/software/jdk-8u212-linux-x64.tar.gz
ENV JAVA_HOME=/data/module/jdk1.8.0_212
ENV PATH=$JAVA_HOME/bin:$PATH

说明:
  1. 每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
  2. 第一条FROM,指定使用哪个镜像源
  3. RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
  4. COPY 是把文件copy到镜像中.   源文件必须是相对路径不能是绝对路径
  5. ENV 在镜像中设置环境变量
  • 创建镜像, 并等待创建成功
docker build -t centos_java8:1.0 .

说明:
  1. -t 指明镜像名字和标签
  2. . 表示Dockfile所在目录
  • 测试镜像是否可以正常工作
docker run centos_java8:1.0 java -version

2.2 保存和加载镜像使用保存和加载功能可以把本机的镜像发给其他人使用
2.2.2 保存镜像
docker save -o duo_centos_java8.tar centos_java8:1.0

2.2.3 加载镜像
把刚刚保存的镜像发给别人(hadoop103), 然后加载导入.
sudo docker load -i duo_centos_java8.tar

3、为镜像添加ssh服务很多镜像是不带ssh服务的, 管理镜像非常的不方便, 本章介绍如何给镜像添加ssh服务
3.1 创建镜像Dockerfile:
# 设置继承镜像
FROM centos_java8:1.0
# 提供作者信息
MAINTAINER duo (hyu123@126.com)

# 更换国内阿里云yum源
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN sed -i -e /mirrors.cloud.aliyuncs.com/d -e /mirrors.aliyuncs.com/d /etc/yum.repos.d/CentOS-Base.repo
RUN yum makecache

# 安装sshd
RUN yum install -y openssh-server openssh-clients
RUN sed -i /^HostKey/d /etc/ssh/sshd_config
RUN echo HostKey /etc/ssh/ssh_host_rsa_key> > /etc/ssh/sshd_config

# 生成 ssh-key
RUN ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key

# 更改 root 用户登录码为
RUN echo root:123456 | chpasswd

# 开发 22 端口
EXPOSE 22

# 镜像运行时启动sshd
RUN mkdir -p /opt
RUN echo #!/bin/bash > > /opt/run.sh
RUN echo /usr/sbin/sshd -D > > /opt/run.sh
RUN chmod +x /opt/run.sh
CMD ["/opt/run.sh"]


构建
docker build -t centos_java8_sshd:1.0 ./

3.2 运行容器, 测试镜像
docker run -d -p 2222:22 centos_java8_sshd:1.0


说明: 把容器的22端口映射到宿主机器的2222端口, 这样通过ssh连接宿主机器的2222端口就可以连接到容器了.
7.2.1 从宿主机连接到docker容器
ssh root@hadoop01 -p 2222


7.2.2 从docker容器连接到宿主机
ssh duo@192.168.88.111 -p 22







    推荐阅读