七、Docker数据持久化
7.1 将本地目录映射到容器
mkdir -p /data
docker run -itd -v /data/:/data --name=test01 centos bash # -v 指定挂载目录,:前面的/data/ 为宿主机本地目录,:后面的/data/为容器的目录。
在/data/目录创建一个文件
echo 'hello k8s' >/data/hello.txt
在容器里查看文件
docker exec -it test01 bash -c "cat /data/hello.txt"
7.2 数据卷
将宿主机目录挂载到容器目录
数据卷特点:
- 在容器启动初始化时,如果容器使用的宿主机挂载点有数据,这些数据会copy到容器中。
- 数据卷可以在容器中直接使用。
- 容器可以修改数据卷的内容
- 数据卷的变化不会影响镜像的更新。
- 删除容器不会影响数据卷的数据
创建数据卷
docker volume create testvol
列出数据卷
docker volume ls
查看数据卷
docker volume ls
查看数据卷信息
docker volume inspect testvol
使用数据卷
docker run -itd --name=test02 -v testvol:/data/ centos
多个容器共享一个数据卷
docker run -itd --name test03 -v testvol:/data/ centos
从容器copy到宿主机或从宿主机copy到容器
docker cp /etc/passwd test01:/tmp/
docker exec -it test01 cat /tmp/passwd
docker cp test01:/tmp/passwd /tmp/
八、Docker网络模式和端口
Docker 服务启动时会生成一个docker0的网卡,这个网卡是实现容器网络通信的根本,默认容器使用网络类型为桥接(bridge)模式。
每启动一个容器,都会产生一个虚拟网卡vethxxx
查看Docker相关的 nat表
iptables -nvL -t nat
8.1 Docker支持五种网络模式
8.1.1 host模式
容器不会获得一个独立的network namespace,而是使用宿主机network namespace,共享宿主机ip
docker run -itd --name=test001 --net=host centos
这种模式,容器和宿主机共享主机名和ip。
8.1.2 container模式
在启动容器时,需要指定容器ID或者name,将要启动的容器使用和目标容器一样的网络。与指定的容器使用同一个network namespace ,网卡配置也相同。
docker run -itd --net=container:/test001 --name=test002 centos
8.1.3 none 模式
不需要配置网络
docker run --itd --net=none --name=test003 centos bash
ip addr 查看没有ip
docker exec -it test003 bash -c "ip add"
8.1.4 bridge模式
默认网络,或者使用--net=bridge 指定配置
8.1.5 自定义docker 网段
默认与bridge网络一样
docker network create zhan
docker network ls
docker run -itd --name=test005 --network=zhan nginx
8.2 端口映射
docker run -itd -v /data/:/var/www/html/ -p 8080:80 --name=test006 centos bash
九、Dockerfile格式讲解
Dockerfile:实现自定义镜像的一种手段,通过编写Dockerfile,编译成想要的镜像。
9.1 FROM 指定基础镜像
FROM centos:7
9.2 MAINTAINER 指定作者信息
MAINTAINER ZHAN [email protected]
9.3 RUN 后面跟具体的命令
RUN yum update -y
RUN yum -y install gcc gcc-c++ make zlib-devel pcre-devel openssl-devel
9.4 CMD 指定容器启动时用到的命令,只能有一条
CMD command param1 param2
CMD ["param1","param2"]
CMD ["/bin/bash","/usr/local/nginx/sbin/nginx","-c","/usr/local/nginx/conf/nginx.conf"]
9.5 EXPOSE 指定要映射的端口
EXPOSE <port> [<port>...]
EXPOSE 22 80 8080 443 # 启动容器时,-P 自动分配端口,-p指定具体端口
9.6 ENV 为后续的RUN指令提供一个环境变量。
EMV MYSQL_VERSION 5.7
9.7 ADD 将本地的一个文件或目录copy到容器的某个目录,其中src为Dockerfile所在目录的相对路径,也可以是一个路径。
ADD conf/vhost /usr/local/nginx/conf
ADD http://nginx.org/download/nginx-1.24.0.tar.gz .
9.8 COPY 类似ADD,将本地文件copy到容器,不支持URL。
COPY passwd /tmp/123.txt
9.9 ENTRYPOINT 格式类似CMD
容器启动时要执行的命苦,只有一条生效,如果有多个,只有最好一条生效。
ENTRYPOINT /usr/local/nginx/sbin/nginx -g "daemon off;"
9.10 VOLUME 创建一个可以从宿主机或者其他容器挂载的挂载点
VOLUME ["/data"]
9.11 USER 指定RUN、CMD或者ENTRYPOINT 运行时使用的用户
USER zhan
9.12 WORKDIR 为后续的RUN、CMD或者ENTRYPOINT 指定工作目录
WORKDIR /opt/
十、Dockerfile编译自定义镜像
10.1 Build 镜像命令
使用Dockerfile文件构建镜像
docker build [OPTIONS] PATH|URL|
-t,--tag list #指定镜像名称标签
-f,--file string #指定Dockerfile文件位置
docker build -t 镜像名 . #默认找当前目录下的Dockerfile文件
10.2 使用Docker 创建nginx容器
cat Dockerfile
FROM centos:7
RUN yum update -y
RUN yum -y install gcc gcc-c++ make zlib-devel pcre-devel openssl-devel
ADD http://nginx.org/download/nginx-1.24.0.tar.gz .
RUN tar zxvf nginx-1.24.0.tar.gz
RUN mkdir -p /usr/local/nginx
RUN cd nginx-1.24.0 && ./configure --prefix=/usr/local/nginx && make && make install
COPY index.html /usr/local/nginx/html/index.html
EXPOSE 80
ENTRYPOINT /usr/local/nginx/sbin/nginx -g "daemon off;"
# docker build -t nginx:v1 .
# docker run -itd --name test_nginx -P nginx:v1
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
23eb06eb1c63 nginx:v1 "/bin/sh -c '/usr/lo…" 13 seconds ago Up 12 seconds 0.0.0.0:32768->80/tcp, :::32768->80/tcp test_nginx
# curl 127.0.0.1:32768