Docker
1、概念
- 镜像:可以理解为软件安装包,可以方便的进行传播和安装。
- 容器:软件安装后的状态,每个软件运行环境都是独立的、隔离的,称之为容器。
1.1、安装
https://docs.docker.com/engine/install/#server
1.2、镜像加速源
镜像加速器 | 镜像加速器地址 |
---|---|
Docker 中国官方镜像 | https://registry.docker-cn.com |
DaoCloud 镜像站 | http://f1361db2.m.daocloud.io |
Azure 中国镜像 | https://dockerhub.azk8s.cn |
科大镜像站 | https://docker.mirrors.ustc.edu.cn |
阿里云 | https://<your_code>.mirror.aliyuncs.com |
七牛云 | https://reg-mirror.qiniu.com |
网易云 | https://hub-mirror.c.163.com |
腾讯云 | https://mirror.ccs.tencentyun.com |
通过:registry-mirrors参数配置
2、Docker 快速安装软件
2.1、演示 Docker 安装 Redis
Docker 官方镜像仓库查找 Redis :https://hub.docker.com/
安装: docker run -d -p 6379:6379 –name redis redis:latest
3、命令参考
https://docs.docker.com/engine/reference/run/
3.1、仓库相关
命令 | 描述 |
---|---|
docker search $KEY_WORD | 查找镜像 |
docker pull $REGISTRY:$TAG | 获取镜像 |
docker push $IMAGE_NAME:$IMAGE_TAG | 推送镜像到仓库,需要先登录 |
docker login $REGISTRY_URL | 登录仓库 |
docker logout $REGISTRY_URL | 退出仓库 |
docker info | 显示Docker详细的系统信息,可查看仓库地址 |
docker version | 显示Docker信息 |
docker –help | 显示Docker的帮助信息 |
3.2、容器相关
命令 | 描述 |
---|---|
docker attach $CONTAINER_ID | 启动一个已存在的docker容器 |
docker stop $CONTAINER_ID | 停止docker容器 |
docker start $CONTAINER_ID | 启动docker容器 |
docker restart $CONTAINER_ID | 重启docker容器 |
docker kill $CONTAINER_ID | 强制关闭docker容器 |
docker pause $CONTAINER_ID | 暂停容器 |
docker unpause $CONTAINER_ID | 恢复暂停的容器 |
docker rename $CONTAINER_ID | 重新命名docker容器 |
docker rm $CONTAINER_ID | 删除容器 |
docker logs $CONTAINER_ID | 查看docker容器运行日志,确保正常运行 |
docker inspect $CONTAINER_ID | 查看container的容器属性,比如ip等等 |
docker port $CONTAINER_ID | 查看container的端口映射 |
docker top $CONTAINER_ID | 查看容器中正在运行的进程 |
docker commit $CONTAINER_ID $NEW_IMAGE_NAME:$NEW_IMAGE_TAG | 将容器保存为镜像 |
docker ps -a | 查看所有容器 |
docker stats | 查看容器的资源使用情况 |
3.3、镜像相关
命令 | 描述 |
---|---|
docker images | 查看本地镜像 |
docker rmi $IMAGE_ID | 删除本地镜像 |
docker rmi -f $(docker images -qa) | 删除本地所有镜像 |
docker inspect $IMAGE_ID | 查看镜像详情 |
docker save $IMAGE_ID > 文件路径 | 保存镜像为离线文件 |
docker save -o 文件路径 $IMAGE_ID | 保存镜像为离线文件 |
docker load < 文件路径 | 加载文件为docker镜像 |
docker load -i 文件路径 | 加载文件为docker镜像 |
docker tag $IMAGE_ID $NEW_IMAGE_NAME:$NEW_IMAGE_TAG | 修改镜像TAG |
docker run 参数 $IMAGE_ID $CMD | 运行一个镜像 |
docker history $IMAGE_ID | 显示镜像每层的变更内容 |
3.4、run命令相关
参数 | 描述 |
---|---|
-d | 后台运行容器, 并返回容器ID;不指定时, 启动后开始打印日志, Ctrl+C退出命令同时会关闭容器 |
-i | 以交互模式运行容器, 通常与-t同时使用 |
-t | 为容器重新分配一个伪输入终端, 通常与-i同时使用 |
–name container_name | 设置容器名称, 不指定时随机生成 |
-h container_hostname | 设置容器的主机名, 默认随机生成 |
–dns 8.8.8.8 | 指定容器使用的DNS服务器, 默认和宿主机一致 |
-e docker_host=172.17.0.1 | 设置环境变量 |
–cpuset="0-2” or –cpuset="0,1,2” | 绑定容器到指定CPU运行 |
-m 100M | 设置容器使用内存最大值 |
–net bridge | 指定容器的网络连接类型, 支持bridge/host/none/container四种类型 |
–ip 172.18.0.13 | 为容器指定固定IP(需要使用自定义网络none) |
–expose 8081 –expose 8082 | 开放一个端口或一组端口,会覆盖镜像设置中开放的端口 |
-p [宿主机端口]:[容器内端口] | 宿主机到容器的端口映射,可指定宿主机的要监听的IP,默认为0.0.0.0 |
-P | 注意是大写的, 宿主机随机指定一组可用的端口映射容器expose的所有端口 |
-v [宿主机目录路径]:[容器内目录路径] | 挂载宿主机的指定目录(或文件)到容器内的指定目录(或文件) |
–add-host [主机名]:[IP] | 为容器hosts文件追加host, 默认会在hosts文件最后追加[主机名]:[容器IP] |
–volumes-from [其他容器名] | 将其他容器的数据卷添加到此容器 |
–link [其他容器名]:[在该容器中的别名] | 添加链接到另一个容器,在本容器hosts文件中加入关联容器的记录,效果类似于–add-host |
3.5、进入当前正在运行的容器
docker exec -it 容器id /bin/bash #进入容器开启新的终端 docker attach 容器id /bin/bash #进入容器正在执行的终端,不会启动新的进程
3.6、从容器拷贝文件到主机
docker cp 容器id:容器内路径 目的的主机路径
4、容器数据卷
4.1、使用数据卷
4.1.1、直接使用命令来挂载 -v
- docker run -it -v [宿主机目录路径]:[容器内目录路径] centos /bin/bash
- docker inspect 容器id #查看Mounts 双向同步的,在容器中改,或者在宿主机改,都会互相同步的。
4.1.2、匿名挂载
- -v 容器内路径:
docker run -d -P -name nginx01 -v /etc/nginx nginx - 查看所有卷的情况 docker volume ls
4.1.3、具名挂载
- -v 卷名:容器内路径:
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx nginx - 查看一下这个卷 docker volume inspect 卷名
4.1.4、指定路径挂载
- -v 宿主路径:容器内路径
4.1.5、扩展
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx:ro nginx #容器不能修改 ro: 只读, rw:可读写
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data
4.2、通过Dockerfile
参考5、Dockerfile
4.3、数据卷容器
利用容器给别的容器共享数据
docker run -it –name docker01 [容器名称/id]
docker run -it –name docker02 –volumes-from docker01 [容器名称/id]
5、Dockerfile
Dockerfile是用来构建docker镜像文件
5.1、构建步骤
- 编写一个dockerfile文件
- docker build 构建成一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库)
5.2、Dockerfile的指令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的, 姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤,tocat镜像;添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录位置
EXPOSE #暴露端口
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承DockerFile 这个时候就会运行ONBUILD的指令、触发指令
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量
5.3、实战
scratch 最基础镜像
5.3.1、编写dockerfile文件
FROM centos
MAINTAINER mrc<mrc@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
5.3.2、构建
docker build -f dockerfile文件路径 -t 镜像名:[tag] .
5.4、研究人家dockerfile如何做的
docker history 镜像id
5.5、CMD和ENTRYPOINT 区别
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
5.6、发布自己的镜像
git push [容器名]:[版本号]
6、Docker网络
6.1、原理
我们每启动一个docker容器 docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0
桥接模式,使用的技术是evth-pair技术
我们发现这个容器带来的网卡,都是一对对的
evth-pair 就是一对虚拟设备接口,他们都是成对出现的,一段俩这协议,一段彼此相连
正以为有这个特性,evth-pair充当了桥梁,连接各种虚拟网络设备的
openstac docker容器之间的连接,都是使用evth-pair技术
容器和容器之间是可以互相ping通的
6.2、–link
思考一个场景,我们编写了一个微服务,database url=ip 项目不重启,数据库ip换掉了,我们希望可以处理这个问题。可以名字来进行访问吗?
docker run -d -P -name tomcat03 –link tomcat02 tomcat
docker exec -it tomcate ping tomcate02
6.3、自定义网络
6.3.1、网络模式
- bridge: 桥接docker (默认,自己创建也使用bridge模式)
- none: 不配置网络
- host: 和宿主机共享网络
- container: 容器网络连通 (用的少,局限很大)
#我们直接启动的命令 --net 吧 ridge, 而这个就是我们的docker0
docker run -d -P --name tomcat01 --net bridge tomcat
# docker0特点, 默认,域名不能访问, --link可以打通连接
# 我们可以自定义一个网络
# --driver bridge
# --subnet 192.168.0.0/16 192.168.0.0/24
# --gateway 192.168.0.1
docker network create --driver bridge --subnet 192.168.0.0、16 --gateway --gateway 192.168.0.1 mynet
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络
6.3.2、网络连通
docker network connect mynet tomcat01
7、redis集群部署实战
// todo::