Docker Commands
启动docker服务
sudo service docker start
镜像
docker images
docker pull [image_name]
容器
docker ps # 运行中的容器
docker ps -a # 所有容器,包括关掉的
exit() # 退出容器,会关闭
ctrl + p + q # 退出容器,不会关闭
docker pull [name]
docker start [id] # 结合docker ps -a,重启一个容器
docker attach [id] # 进入一个正在运行的容器
docker exec -it [id] /bin/bash # 进入一个运行中的容器
docker
docker commit -m "" -a "author" [id] [name]:[TAG] # 容器打包成一个镜像,他会出现在docker images里面
-
容器持久化(数据卷)
docker run -it -v 主机目录:容器目录 [image] /bin/bash example: docker run -it -v /home/ceshi:/home centos /bin/bash
命令混用:
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
# -d:后台运行
# -v:挂载
# -e:环境设置
- 具体挂载和匿名挂载
# 匿名挂载
-v 容器内路径!就是没有写主机路径,然后他会自动生成很难看的名字
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的volume的情况
docker volume ls
# 具名挂载,相对于路径,路径是要有一个‘/’的,这里直接写名字了
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 看具体目录
docker volume inspect juming-nginx
拓展:
ro: readonly
rw: read write # 默认
都是对于容器来说的,也就是说主机一定是最高权限
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
Dockerfile demo
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "----end----"
CMD /bin/bash
多个mysql实现数据共享(使用 –volumes-from命令)
example:
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
# 意思就是开一个mysql02,并且在mysql01中找到“已经挂载到本地主机的卷”,不会把所有文件同步
Dockerfile
构建步骤:
- 编写一个Dockerfile 文件
- docker build 构建成一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库)
Dockerfile构建过程
基础知识:
- 指令必须是大写字母
- 执行从上到下
- #表示注释
- 每一个指令都是一层
example:
常用指令
发布自己的镜像
DockerHub
docker login
docker tag [id] [username]/[image]:[tag]
docker push [username]/[image]:[TAG]
Docker网络
理解Docker0
ip addr
原理
-
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker就会有一个网卡docker0
桥接模式,使用的技术是veth-pair技术!
启动一个容器,就会有一个veth-pair
# 我们会发现这个容器带来的网卡,都是一对对的 # veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连 # 正因为有这个特性,veth-pair 充当一个桥梁连接各种虚拟网络设备
两个docker容器共用一个路由器,docker0 所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip
小结
-
–link命令:建立容器名的访问
单向,本来要ping一个ip的,现在可以ping一个名字,相当于在hosts里面加一个映射
自定义网络
查看所有的docker网络
docker network ls
网络模式
bridge:桥接docker(默认) none:不配置网络 host:和宿主机共享网络 container:容器网络连通!(用的少!局限很大)
测试
# 我们直接启动的命令 --net bridge,而这个就是我们的docker0
docker run -d -P --name tomcat --net bridge tomcat
# docker0特点,默认,域名不能访问, --link可以打通连接!
服务器部署
注意:监听的地址不是localhost,要用ip addr看一眼!!!或者进hosts看
应该监听在docker中的地址,docker0(主机)可以访问到它,主机也可以通过主机的localhost来找到它(它能监听到)