网络管理:
容器中的环境与宿主机隔离,那么此时容器内如何与外部进行网络通信就有了些小问题,我们可以通过以下一些命令来查看 Docker 容器的网络状况,Docker 也为我们提供了一些简单的配置来将宿主机的端口与容器内的端口实现映射
对容器的网络访问配置映射:
随机映射:
docker run -P -d --rm redis:3.2
-P 会将容器中暴露的端口随机映射到宿主机的某一个端口上
-d 后台运行
--rm 容器停止会自动删除容器
指定映射:
示例:
docker run -p 6379:6379 -d --rm redis:3.2
-p hostPort : containerPort 示例:docker run -p 6379:6379 -d --rm redis
-p ip:hostPort : containerPort 示例:docker run -p 127.0.0.1:6380:6379 -d --rm redis
-p ip: : containerPort 示例:docker run -p ::6379 -d --rm redis #随机映射端
口
-p 参数可以指定多次, 如: -p 91:80 -p 92:443.....
===========================================================
数据卷(volume):
问题:
不能在宿主机上很方便地访问容器中的文件。
无法在多个容器之间共享数据。
当容器删除时,容器中产生的数据将丢失。
在Docker的使用过程中往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,所以这就涉及到Docker容器的数据操作。
容器中数据管理主要有两种方式:数据卷和数据卷容器。
数据卷(Data Volumes) 容器内数据直接映射到本地宿主机。
数据卷容器(Data Volume Containers) 使用特定容器维护数据卷。
数据卷的特性:
数据卷是一个特殊的目录,它将主机目录直接映射进容器。可供一个或多个容器使用。
数据卷设计的目的就是为了数据的持久化,它完全独立与容器的生命周期。因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。
数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
数据卷可以在容器之间共享和重用
可以对数据卷里的内容直接修改,修改回马上生效,无论是容器内操作还是本地操作
对数据卷的更新不会影响镜像的更新
数据卷会一直存在,即使挂载数据卷的容器已经被删除
绕过 docker 的 vfs, 直接将数据存储在物理机中
命令:
-v src : dest #将src目录映射到容器中dest目录(容器中如果不存在dest会自动创建该目录)
示例:
# 启动容器, 并指定容器名字
# -h 表示指定主机名
docker run -it --name volume-test1 -h centos -v /data centos
# 查看容器的 volume 映射在物理机的什么位置
# 老版本应使用 -f '{{.Volumes}}'
# 该物理目录会与容器内挂载的目录共享
docker inspect -f '{{index .Mounts 0}}' volume-test1
# 指定映射目录
# -v /opt:/opt 表示将物理机的 /opt 目录映射到 容器中的 /opt 目录
# -v /opt:/opt:ro 表示该目录在容器内只读, 不能写
docker run -it --name volume-test2 -h centos -v /opt:/opt centos
redis 示例: ()
创建宿主机目录/var/redis/data 用来存放redis持久化数据
创建宿主机目录/etc/redis:/etc/redis 用来存放redis配置文件redis.conf (需要手动拷贝配置文件到此目录并修改dump文件存放目录)
挂在数据卷并启动容器
docker run -d -p 6379:6379 \
-v /data:/data \
redis \
redis-server /data/redis.conf
ps:使用redis请务必将redis.conf 中bind 修改为0.0.0.0, 如果使用127.0.0.1使用redis服务会报错
如果启动报错permission xxx 请更改文件访问权限
用法:
将代码存放到指定目录. 如 /data/code, /data/logs, /data/conf 用来统一管理每一个环境的代码, 日志, 配置等, 那么此时将所有容器构建好, 在每个环境下面启动容器时按照此规则映射即可. 若要跑多种版本的业务, 又可以以 code 目录再去细分某些业务, 当然这只是一种解决方案, 可以根据这种思路进行拓展.
数据卷容器:
数据卷容器专门用于存储数据的容器, 那么其他容器就不需要去挂载了, 都可以从这个专门的数据卷容器中读取数据. 无论数据卷容器有没有启动, 其它容器都可以通过它读取数据.
命令:
--volumes-from ContainerId
示例:
# 为当前新启动的容器设置数据卷容器
docker run -it --name volume-test3 --volumes-from volume-test2 centos
===========================================================
镜像的构建方式:
image.png
手动构建(纯手动):
1. 基于 centos 的官方镜像在容器内写一个输出 build myImage... 的脚本, 脚本名hello.sh
2. 将该容器构建为基础镜像
命令: docker commit -m
示例:
# 打包镜像
docker commit -m "我的镜像" e288e2b6b65f sky/myImage:v1
1.我的镜像为镜像描述信息
2.e288e2b6b65f 基础容器id
3 sky/myimage:tag 为镜像名:一般命名格式为:用户名/镜像名 , v1为tag,也就是版本号
# 以该镜像启动容器
docker run --rm sky/myImage:v1 hello.sh
自动构建(Dockerfile):
● 基础镜像信息
● 维护者信息
● 镜像操作指令
● 容器启动时执行指令
构建:
1. 创建专门管理 Dockerfile 的文件夹
2. 创建文件 Dockerfile(名字必须按照该风格)
3. 基础镜像所需的配置
a. FROM base_image 基础镜像
b. MAINTAINER author 维护者信息
c. RUN command 运行指定命令
d. ADD file to_path 拷贝主机文件到容器中,如果是压缩文件会自动解压
e. WORKDIR path 实际上就是 cd 到指定目录
f. VOLUME ["path"] 数据挂载
g. EXPOSE port 暴露端口
h. ENV key value 创建环境变量
i. CMD command 执行命令
4. 构建镜像
命令:
docker build -t repoName:tag dockerfile_path
示例:
docker build -t nginx-file:v1 .
===========================================================
restart 容器的重启策略:
no:默认策略,在容器退出时不重启容器
on-failure:在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3:在容器非正常退出时重启容器,最多重启3次
always:在容器退出时总是重启容器
unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
3. 常用命令
docker-compose up -d # 启动所有服务并在后台运行
docker-compose ps # 查看服务运行状态,只查询自己管理的容器
docker-compose restart # 重启所有服务
docker-compose restart myApp # 重启 myApp 服务
docker-compose stop# 停止所有服务
docker-compose start # 开启所有服务
docker-compose start myApp #开启 myApp 服务
docker-compose stop myApp # 停止 myApp 服务
docker-compose rm # 删除所有服务
docker-compose rm myApp # 删除 myApp fuwu
weave
网友评论