一个完整的docker镜像可以支撑一个docker容器的运行,在docker的挣个使用过程中进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务,如果要把已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像
数据管理:数据卷
# 创建数据卷
[root@localhost ~]# docker run -d -v /test --name abc bbox:v1
[root@localhost ~]# docker exec -it abc /bin/sh
/ # ls
bin dev etc home proc root sys test tmp usr var
/ #
# -v 在容器内创建数据卷 -v xxx -v xxx 可以指定多个数据卷
# 数据卷映射
[root@localhost ~]# docker run -d -it -v /abc:/test --name alias bbox:v1
# 此时在宿主的/abc目录下创建文件将会同步到容器/test中
# 如果需要在容器之间共享一些数据
[root@localhost ~]# docker run -d -it --volumes-from alias --name alias1 bbox:v1
# 此时容器之间数据将共享。
基于已有容器创建镜像
[root@localhost ~]#docker commit [选项] 容器ID/名称 仓库名称:[标签]
# -m:说明信息
# -a: 作者信息
# -p: 生成过程中停止容器的运行
例子:docker commit -m "new image" -a "daoke" 容器ID或名称 新名称:标签
dockerfile 操作指令
指令 | 含义 |
---|---|
FROM 镜像 | 指定新镜像所基于的镜像,第一条指令必须为FROM。每创建一个镜像就需要一条FROM指令 |
MAINTAINER 名字 | 说明新镜像的维护人信息。注:docker已弃用但不影响使用,新指令为LABEl |
RUN 指令 | 在所基于的镜像上执行命令,并提交到新的镜像中 |
CMD [“要运行的程序”,“参数1”,“参数2”] | 指定启动容器时要运行的命令或脚本,只能有一条CMD命令。 |
EXPOSE 端口号 | 指定新镜像加载到docker时要开启的端口 |
ENV 环境变量 变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
ADD 源文件/目录 目标文件/ 目录 | 将源文件复制到目标文件,源文件要与dockerfile位于一个目录下,或者是一个URL |
COPY 源文件/目录 目标文件/ 目录 | 将本地主机上的源文件、目录复制到目标地点 源文件要与dockerfile位于一个目录下 |
VOLUME [“目录”] | 在容器中创建一个挂载点 |
USER 用户名/UID | 指定运行容器是的用户 |
WORKDIR 路径 | 为后续的RUN、CMD、ENTRYPOINT指定工作目录 |
ONBUILD 命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
ENTRYPOINT | 使用容器作为可执行文件时应定义。不可被覆盖 |
基于dockerfile创建nginx镜像:
# 一般创建独立目录
mkdir nginx
[root@localhost ~]# vim nginx/dockerfile
# 一些描述信息
#nginx
#nginx:v1
# 第一行必须指明基于的基础镜像
FROM centos:7
# 维护改镜像的用户信息
LABEL maintainer="nginx"
# 镜像操作指令
RUN rm -rf /etc/yum.repos.d/*
COPY CentOS-Base.repo /etc/yum.repos.d/
RUN yum -y install gcc gcc-c++ make openssl-devel pcre-devel gd-devel net-tools wget curl \
telnet iproute \
&& yum clean all \
&& rm -rf /var/cache/yum/*
ADD nginx-1.12.0.tar.gz ./
RUN cd nginx-1.12.0 \
&& ./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
&& make -j 2 && make install \
&& rm -rf /usr/local/nginx/html/* \
&& echo "ok">/usr/local/nginx/html/index.html \
&& cd / && rm -rf nginx-1.12.0* \
&& ln -s /usr/local/nginx/sbin/* /usr/local/sbin \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
[root@localhost ~]# docker build -t nginx:v1
# 等待镜像制作完成
端口映射网络通信:
# 随机端口
[root@localhost ~]# docker run -d -it -P nginx:v1
[root@localhost ~]# docker ps -a
5fbae5201f04 nginx:v1 "nginx -g 'daemon of…" 4 hours ago Up 4 hours 0.0.0.0:32769->80/tcp nginx
# 固定端口
[root@localhost ~]# docker run -d -it -p 80:80 nginx:v1
[root@localhost ~]# docker ps -a
5fbae5201f04 nginx:v1 "nginx -g 'daemon of…" 4 hours ago Up 4 hours 0.0.0.0:80->80/tcp nginx
# -P 大P为随机49000 - 49900端口
# -p 小p为指定固定端口
容器互联:
# link 不推荐使用
# 先创建一个源容器
[root@localhost ~]# docker run -d -it -P --name aaa bbox:v1
# 创建接受容器
[root@localhost ~]# docker run -d -P -it --name aaab --link aaa:aaa bbox:v1
# 进入容器测试连通性
[root@localhost ~]# docker exec -it aaab /bin/sh
/ # ping aaa
PING aaa (172.17.0.6): 56 data bytes
64 bytes from 172.17.0.6: seq=0 ttl=64 time=0.109 ms
64 bytes from 172.17.0.6: seq=1 ttl=64 time=0.065 ms
64 bytes from 172.17.0.6: seq=2 ttl=64 time=0.066 ms
64 bytes from 172.17.0.6: seq=3 ttl=64 time=0.064 ms
64 bytes from 172.17.0.6: seq=4 ttl=64 time=0.064 ms
64 bytes from 172.17.0.6: seq=5 ttl=64 time=0.096 ms
# 自定义docker网络
[root@localhost ~]# docker network create -d bridge my-net
[root@localhost ~]# docker run -d -it --name linux --network my-net centos:7
[root@localhost ~]# docker run -d -it --name linux1 --network my-net centos:7
[root@localhost ~]# docker exec -it linux /bin/bash
[root@7bdc1a9031af /]# ping linux1
PING linux1 (172.18.0.3) 56(84) bytes of data.
64 bytes from linux1.my-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.121 ms
64 bytes from linux1.my-net (172.18.0.3): icmp_seq=2 ttl=64 time=0.055 ms
# 同理登录linux1
[root@localhost ~]# docker exec -it linux1 /bin/bash
[root@49948a9b2f17 /]# ping linux
PING linux (172.18.0.2) 56(84) bytes of data.
64 bytes from linux.my-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.120 ms
64 bytes from linux.my-net (172.18.0.2): icmp_seq=2 ttl=64 time=0.091 ms