一、概述与入门(安装和配置)[1]
官方文档: https://docs.docker.com/
Docker众所周知,方便了运维成本,有一次编译到处运行的说法
- Docker安装前提:
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本
CentOS 7 的内核一般都是3.10的,而CentOS 6.X 的内核一般都是2.6,在2.6的内核下,Docker运行会比较卡,所以一般会选择升级到3.10版本。
eg:如果是低内核,需要升级,升级步骤:
#升级内核版本(包含aufs)
cd /etc/yum.repos.d
wget http://www.hop5.in/yum/el6/hop5.repo
yum install kernel-ml-aufs kernel-ml-aufs-devel
#修改引导的内核
vi /etc/grub.conf
# 把默认的引导文件设置为0。因为升级内核之后,新的内核在第一个(0)位置。
1. 安装上centos7之后,所有的命令最好用sudo,配置sudo,接下来将yum更新到最新
sudo yum update -y
sudo yum -y install docker
sudo systemctl start docker
#查看docker版本
sudo docker version
#设置为开机启动
sudo systemctl enable docker
2. 配置docker用户组
背景: 在Linux上,当您运行任何
docker
命令时,docker
二进制文件将尝试连接/var/run/docker.sock
。正如它的.sock
扩展所示,这个文件是一个Unix域套接字 - 基本上,这是多个进程可以在本地计算机上通信的一种方式(也称为IPC机制 - IPC =“进程间通信”)。
默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
# 建立 docker 组:
sudo groupadd docker
# 将当前用户加入 docker 组:
sudo usermod -aG docker $USER
# 退出当前终端并重新登录,进行如下测试。
#校验是否按照成功, 会有 Hello from Docker!显示
[xuchang@localhost opt]$ docker run hello-world
//如果执行无权限
//Got permission denied while trying to connect to the Docker daemon socket at unix
//执行 sudo systemctl restart docker
3. 配置镜像地址(这里使用的是阿里的镜像地址)
阿里镜像比较快,登陆阿里镜像控制台,注册账号,点击左侧菜单镜像加速器,里面有用户专属的镜像地址。
sudo vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://xxx.mirror.aliyuncs.com"],
"hosts": ["tcp://192.168.243.195:2375", "unix:///var/run/docker.sock"]
}
#registry-mirrors指定镜像地址
#hosts指定通信地址, 192.168.243.195本地Ip
#重启
sudo systemctl daemon-reload
sudo systemctl restart docker
4. 拉取基础镜像
//可以选择镜像centos版本,默认是latest
// docker pull <image_name>:<image_tag>
sudo docker pull centos
二、使用Dockfile构建第一个定制镜像[2]
1. 常用的Dockfile指令
comand | describe |
---|---|
FROM | 指定基础镜像,第一条指令 |
RUN | 执行命令 |
COPY | 复制文件 |
ADD | 更高级的复制文件 |
CMD | 容器启动命令 |
ENTRYPOINT | 入口点 |
ENV | 设置环境变量 |
ARG | 构建参数 |
VOLUME | 定义匿名卷 |
EXPOSE | 声明端口 |
WORKDIR | 指定工作目录 |
HEALTHCHECK | 健康检查 |
ONBUILD | "懒加载"其它指令,只有以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行 |
2. 编写Dockfile文件(构建jdk8环境的定制镜像和ssh)
#指定基础镜像
FROM centos
# 作者
MAINTAINER xuchang
# Install libs
# 执行shell命令
RUN yum clean all \
&& yum -y update \
&& yum install -y deltarpm rpm make wget tar unzip \
gcc gcc-c++ \
&& mkdir -p /opt/soft/
# ADD如果 <源路径> 为一个 tar 压缩文件的话,
# 压缩格式为 gzip, bzip2 以及 xz 的情况下,
# ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去
ADD jdk-8u171-linux-x64.tar.gz /opt/soft/
# 配置容器环境变量
ENV JAVA_HOME=/opt/soft/jdk1.8.0_171
ENV PATH=$JAVA_HOME/bin:$PATH
# open ports
# 指令是声明运行时容器提供服务端口,
# 这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
# 使用docker run -P 时,会自动随机映射 EXPOSE 的端口
EXPOSE 22
3. 编译镜像
[xuchang@localhost jdk1.8]$ ls
Dockerfile jdk-8u171-linux-x64.tar.gz
# .表示当前目录
[xuchang@localhost jdk1.8]$ docker build -t centos7-jdk1.8 .
Sending build context to Docker daemon 190.9 MB
Step 1/7 : FROM centos
---> 9f38484d220f
Step 2/7 : MAINTAINER xuchang
---> Running in ec42251bfc5e
---> 491d68bd0b9a
Removing intermediate container ec42251bfc5e
Step 3/7 : RUN yum clean all && yum -y update && yum install -y deltarpm rpm make wget tar unzip gcc gcc-c++ && mkdir -p /opt/soft/
---> Running in 710f74dcfba7
...
...
Complete!
---> d968aee98bb8
Removing intermediate container 710f74dcfba7
Step 4/7 : ADD jdk-8u171-linux-x64.tar.gz /opt/soft/
---> 9fd38879067b
Removing intermediate container d743fba970b5
Step 5/7 : ENV JAVA_HOME /opt/soft/jdk1.8.0_171
---> Running in 4c82a1d8665f
---> 2bef55ddeb5f
Removing intermediate container 4c82a1d8665f
Step 6/7 : ENV PATH $JAVA_HOME/bin:$PATH
---> Running in aa6ea31dc9b2
---> 187365786087
Removing intermediate container aa6ea31dc9b2
Step 7/7 : EXPOSE 22
---> Running in 48616940b48d
---> ee8cf5f337df
Removing intermediate container 48616940b48d
Successfully built ee8cf5f337df
[xuchang@localhost jdk1.8]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7-jdk1.8 latest ee8cf5f337df 12 seconds ago 867 MB
docker.io/centos latest 9f38484d220f 4 months ago 202 MB
centos7-jdk1.8镜像构建完成!!!
4. 构建centos7-base镜像
- 再进一步构建,添加ssh、supervisord(一种Linux监控进程工具)功能
//Dockfile
FROM centos7-jdk1.8
MAINTAINER xuchang
# supervisor 通过脚本进行多应用的启动
# 使用yum install python-setuptools -y来安装supervisor
RUN yum -y update \
&& yum install -y passwd openssh-server openssh-clients initscripts net-tools \
&& yum install python-setuptools -y \
&& easy_install supervisor \
&& echo 'root:root' | chpasswd \
&& /usr/sbin/sshd-keygen
EXPOSE 22
#以后台守护进程方式运行服务器
CMD /usr/sbin/sshd -D
- 编译构建
[xuchang@localhost ssh]$ docker build -t centos7-base .
- 构建完成后
[xuchang@localhost ssh]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7-base latest 3a3cfafe73fd About a minute ago 1.2 GB
centos7-jdk1.8 latest ee8cf5f337df About an hour ago 867 MB
docker.io/centos latest 9f38484d220f 4 months ago 202 MB
三、创建网络[3]
当创建一个网络时,Engine默认为这个网络创建一个不重叠的子网。这个子网不是现有网络的细分。 它纯粹是为了寻址目的。可以直接使用--subnet选项来覆盖这个默认行为并指定一个子网。
docker network create --subnet=192.168.10.0/24 bclz
[4]
- EXPOSE {port}
Dockerfile中该指令只是声明暴露该端口,
使用 run -d {containerId} 运行镜像为容器时,该port端口并不可以访问,使用以下方式可以时宿主机可以访问:
//1.随机映射宿主机端口( 添加-P参数),会使用宿主机随机端口对EXPOSE声明了的端口进行映射,
//比如EXPOSE 8080,宿主机随机端口0.0.0.0:32768->8080/tcp,就可以在宿主机上通过32768访问 docker容器的8080端口了
docker run -d -P {containerId}
//2.指定宿主机端口和容器端口映射( 添加-p {宿主机端口:容器端口}),32768:8080这种形式
docker run -d -p 32768:8080 {containerId}
- 关于VOLUME挂载
是将宿主机的路径挂载到容器路径中,是一种覆盖行为
网友评论