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

图片

大数据技术AI

Flink/Spark/Hadoop/数仓,数据分析、面试,源码解读等干货学习资料

102篇原创内容

公众号

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)

图片

 [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

图片

可以把导出的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 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 ([email protected])
 
 # 更换国内阿里云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 [email protected] -p 22

图片

图片

猜你喜欢

转载自blog.csdn.net/hyunbar/article/details/122512140
今日推荐