赞
踩
大数据技术AI
Flink/Spark/Hadoop/数仓,数据分析、面试,源码解读等干货学习资料
102篇原创内容
公众号
容器是 Docker 的另一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。
如果认为虚拟机是模拟运行的一整套操作系统(包括内核、 应用运行态环境和其他系统环境)和跑在上面的应用。那么 Docker 容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。
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
docker stop c720d3f24d32
在使用 -d 参数时,容器启动后会进入后台(有些容器默认就是后台, 比如centos容器)。此时想要进入容器,可以通过以下指令进入:
docker exec -it bcc /bin/bash
通过指定 -it参数来保持标准输入打开, 并且分配一个伪终端。可以看到会打开一个新的 bash 终端,在不影响容器内其他应用的前提下,用户可以与容器进行交五。
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
某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用 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
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态.
docker export -o '/docker-centos.tar' 1032
可以把导出的tar文件, 传输到其他设备, 再通过导入命令导入, 实现容器的迁移.
将上节导出的容器导入之后会成为镜像.
docker import docker-centos.tar -- test/mycentos:0.0.1
使用新的镜像启动容器:刚才创建的文件还在
docker container inspect 9fa
会以 json 格式返回包括容器 Id、创建时间、路径、状态、镜像、配置等在内的各项信息
docker top 103
这个子命令类似于 Linux 系统中的 top 命令, 会打印出容器内的进程信息, 包括 PID 、 用户、时间、命令等
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
容器和主机之间进行文件复制的时候, 要保证容器已经启动.
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
[duo@hadoop01 ~]$ docker cp c72:/123.log ./456.log
[duo@hadoop01 ~]$ ls
123.log 公共 视频 文档 音乐 456.log
创建镜像的方法主要有2种:
基于已有容器创建。
基于Dockerfile 创建
docker commit -m 'add new file : a.txt' -a 'duo' 9fa new_centos:1.0
说明:
-m 提交信息
-a 作者
9fa 旧有的容器
new_centos:1.0 新的镜像
基于 Dockerfile 创建是最常见的方式。Dockerfile 是一个文本文件, 利用给定的指令描述基于某个父镜像创建新镜像的过程。
下面使用Dockerfile创建一个基于centos的java开发环境:
新建目录:mkdir ./dockerfile_jdk
把jdk安装转包copy到 ./dockerfile_jdk目录下
cp jdk-8u212-linux-x64.tar.gz ./dockerfile_jdk
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
使用保存和加载功能可以把本机的镜像发给其他人使用
docker save -o duo_centos_java8.tar centos_java8:1.0
把刚刚保存的镜像发给别人(hadoop103), 然后加载导入.
sudo docker load -i duo_centos_java8.tar
很多镜像是不带ssh服务的, 管理镜像非常的不方便, 本章介绍如何给镜像添加ssh服务
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 ./
docker run -d -p 2222:22 centos_java8_sshd:1.0
说明: 把容器的22端口映射到宿主机器的2222端口, 这样通过ssh连接宿主机器的2222端口就可以连接到容器了.
ssh root@hadoop01 -p 2222
ssh duo@192.168.88.111 -p 22
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。