大数据技术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
说明:
-
创建一个交互式的容器
-
-i: 允许你对容器内的标准输入 (STDIN) 进行交互
-
-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
说明:
-
检查本地是否存在指定的镜像,不存在就从公有仓库下载;
-
利用镜像创建一个容器,并启动该容器;
分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
- 查看有哪些容器
- 查看所有容器
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
说明:
-
-m 提交信息
-
-a 作者
-
9fa 旧有的容器
-
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
说明:
-
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
-
第一条FROM,指定使用哪个镜像源
-
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
-
COPY 是把文件copy到镜像中. 源文件必须是相对路径不能是绝对路径
-
ENV 在镜像中设置环境变量
- 创建镜像, 并等待创建成功
docker build -t centos_java8:1.0 .
说明:
-
-t 指明镜像名字和标签
-
. 表示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