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

Posted hyunbar777

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 容器的使用和Dockerfile配置ssh服务相关的知识,希望对你有一定的参考价值。

Docker


1、容器基本操作

容器是 Docker 的另一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态

如果认为虚拟机是模拟运行的一整套操作系统(包括内核、 应用运行态环境和其他系统环境)和跑在上面的应用。那么 Docker 容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。

1.1 创建容器

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

centos Tags | Docker Hub(​​https://hub.docker.com/_/centos?tab=tags&page=2​​​​)

Docker

[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 ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c720d3f24d32 centos:7.5.1804 "/bin/bash" About a minute ago Up 8 seconds competent_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
lrwxrwxrwx 1 root root 7 May 31 2018 bin -> usr/bin
drwxr-xr-x 5 root root 360 Jan 9 08:46 dev
drwxr-xr-x 1 root root 4096 Jan 9 08:46 etc
drwxr-xr-x 2 root root 4096 Apr 11 2018 home
lrwxrwxrwx 1 root root 7 May 31 2018 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 31 2018 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 11 2018 media
drwxr-xr-x 2 root root 4096 Apr 11 2018 mnt
drwxr-xr-x 2 root root 4096 Apr 11 2018 opt
dr-xr-xr-x 223 root root 0 Jan 9 08:46 proc
dr-xr-x--- 2 root root 4096 May 31 2018 root
drwxr-xr-x 10 root root 4096 May 31 2018 run
lrwxrwxrwx 1 root root 8 May 31 2018 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 Jan 9 08:43 sys
drwxrwxrwt 7 root root 4096 May 31 2018 tmp
drwxr-xr-x 13 root root 4096 May 31 2018 usr
drwxr-xr-x 18 root root 4096 May 31 2018 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 ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b55484964af2 centos:7.5.1804 "/bin/bash" 34 seconds ago Exited (0) 11 seconds ago keen_lovelace
c720d3f24d32 centos:7.5.1804 "/bin/bash" 12 minutes ago Up 11 minutes competent_diffie
[duo@hadoop01 ~]$ docker rm b55484964af2
b55484964af2
[duo@hadoop01 ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c720d3f24d32 centos:7.5.1804 "/bin/bash" 13 minutes ago Up 12 minutes competent_diffie
  • 删除正在运行的容器:先停止, 再删除
docker rm -f bcc

1.5 导入和导出容器

某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用 Docker 的导人 和导出功能,这也是 Docker 自身提供的一个重要特性。

为了测试容器是否导出和导入成功, 我们在centos容器中创建一个新的文件

[duo@hadoop01 ~]$ docker exec -it 1032 /bin/bash
[root@1032de803222 /]# ls
bin dev docker.txt etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

1.5.1 导出容器

导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态.

docker export -o /docker-centos.tar 1032

Docker

可以把导出的tar文件, 传输到其他设备, 再通过导入命令导入, 实现容器的迁移.

1.5.2 导入容器

将上节导出的容器导入之后会成为镜像.

Docker


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

使用新的镜像启动容器:刚才创建的文件还在

1.6 查看容器

1.6.1 查看容器详情

docker container inspect 9fa

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

Docker

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 ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
1032de803222 sharp_mestorf 0.00% 380KiB / 8.951GiB 0.00% 62kB / 0B 0B / 0B 1

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.log bin dev

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 duo  9fa  new_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

构建

docker build -t centos_java8_sshd:1.0 ./

3.2 运行容器, 测试镜像

docker run -d -p 2222:22 centos_java8_sshd:1.0

Docker

说明: 把容器的22端口映射到宿主机器的2222端口, 这样通过ssh连接宿主机器的2222端口就可以连接到容器了.

7.2.1 从宿主机连接到docker容器

ssh root@hadoop01 -p 2222

Docker

7.2.2 从docker容器连接到宿主机

ssh duo@192.168.88.111 -p 22

Docker



以上是关于Docker 容器的使用和Dockerfile配置ssh服务的主要内容,如果未能解决你的问题,请参考以下文章

Docker虚拟化技术系列之-DockerFile配置

如何进入这个 dockerfile / nginx 容器?

Linux----------容器docker file

[Docker]Dockerfile定制容器

47-Docker-Dockerfile镜像创建自动化生产案例

DOCKER学习_012:Dockerfile配置指令详解