# Docker 介绍
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
# Docker 命令
# 服务相关命令
1 2 3 4
   | systemctl start docker		#--启动docker systemctl restart docker	#--重启docker systemctl status docker		#--查看docker状态 systemctl enable docker		#--设置开机自启docker
   | 
 
# 镜像相关命令
1 2 3 4 5 6
   | docker images				#--查看所有已安装的docker镜像 docker images -q			#--查看所有已安装的docker镜像的id docker search 镜像名	  	  #--从网络中查找需要的镜像 docker pull 镜像名:镜像版本	#--拉去镜像,版本可不写,默认lastest docker rmi 镜像id			   #--通过id删除镜像 docker rmi `docker images -q`#--删除所有已安装镜像
   | 
 
# 容器相关命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | docker run -it --name=c1 centos:7 /bin/bash	
  #其中-i表示容器一直运行 #-t表示分配给该容器一个可供输入的后台终端 #--name给容器起名字,其中=可以换成空格 #centos:7选择镜像名与镜像版本 #/bin/bash可不加,添加初始进入路径
  #使用-it创建的容器会直接进入,退出时直接关闭。it创建的容器一般称为交互式容器 #使用-id创建的容器会在后台挂起,退出时不会直接关闭。id创建的容器一般称为守护式容器 #docker exec -it(或id) c2 /bin/bash进入
  exit		#--退出容器
  docker ps -a		#--查看所有容器
  docker stop 容器名		#--停止容器 docker start 容器名	#--启动容器 docker rm 容器名(或id)	#--删除容器 docker rm `docker ps -aq`	#--删除所有容器 docker inspect 容器名	#--查看容器全部信息
   | 
 
# Docker 容器数据卷
宿主机:运行 docker 的机器
数据卷是宿主机中的一个目录或文件。
将容器中的某个目录与宿主机的某个目录挂载时,宿主机中的该目录称为数据卷
当容器目录和数据卷目录绑定后,双方的修改会立即同步。
- 一个数据卷可以被多个容器挂载
 
- 一个容器也可以挂载多个数据卷
 
数据卷可以解决以下问题:
Docker 容器删除后,为了保留容器产生的数据,使用数据卷,则会在宿主机中保留数据
Docker 容器与宿主机直接交换文件
容器与容器之间的数据交互
# 配置数据卷:
1 2 3 4 5 6 7 8 9 10
   | #创建启动容器时,使用-v参数设置数据卷 docker run ... -v 宿主机目录(文件):容器内目录(文件) ... #注意: #1.目录必须是绝对路径 #2.如果目录不存在,则会自动创建 #3.可以挂载多个数据卷 #例如: docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash #若是不写宿主机目录,则docker会自动创建 #可以使用inspect指令查看
   | 
 
# 数据卷容器:
创建一个容器挂载到数据卷,将其他容器挂载到该容器。
则该容器被称为数据卷容器。
数据卷容器用于管理多容器挂载交互。
1 2 3 4 5 6
   | #实现: docker run -it --name=c3 -v /volume centos:7 docker run -it --name=c1 --volumes-from c3 centos:7 docker run -it --name=c2 --volumes-from c3 centos:7 #创建数据卷容器c3,并由docker自动创建数据卷挂载 #将c1与c2挂载到c3
   | 
 
# Docker 应用部署
# 部署 mysql
1 2 3 4 5 6 7 8 9 10 11 12 13
   | #1.搜索镜像 #2.拉取镜像 #3.创建容器,设置端口映射,目录映射 mkdir ~/mysql cd ~/mysql docker run -id \ -p 3307:3306 \ --name=c_mysql \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:/logs \ -v $PWD/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.6
   | 
 
参数说明:
- -p 3307:3306	将容器的 3306 端口映射到宿主机的 3307 端口
 
- -v $PWD/conf:/etc/mysql/conf.d    挂载
 
- -v $PWD/logs:/logs \    挂载
 
- -v $PWD/data:/var/lib/mysql \    挂载
 
- -e MYSQL_ROOT_PASSWORD=123456 \    初始化 root 用户的密码
 
- 登录 mysql:mysql -uroot -p;
 
# 部署 tomcat
1 2 3 4 5 6 7 8 9
   | #1.搜索镜像 #2.拉取镜像 #3.创建容器,设置端口映射,目录映射 mkdir ~/tomcat cd ~/tomcat docker run -id --name=c_tomcat \ -p 8080:8080 \ -v $PWD:/usr/local/tomcat/webapps \ tomcat
   | 
 
参数说明:
- -p 8080:8080    将容器的 8080 端口映射到主机的 8080 端口
 
- -v $PWD:/usr/local/tomcat/webapps \    挂载
 
# 部署 nginx
1 2 3 4 5 6 7 8 9 10 11
   | #1.搜索镜像 #2.拉取镜像 #3.创建容器,设置端口映射,目录映射 mkdir ~/nginx cd ~/nginx docker run -id --name=c_nginx \ -p 80:80 \ -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \ -v $PWD/logs:/var/log/nginx \ -v $PWD/html:/usr/share/nginx/html \ nginx
   | 
 
参数说明:
- -p 80:80 \    端口映射
 
- -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \    挂载
 
- -v $PWD/logs:/var/log/nginx \    挂载
 
# 部署 redis
1 2 3 4 5 6 7 8
   | #1.搜索镜像 #2.拉取镜像 #3.创建容器,设置端口映射,目录映射 mkdir ~/redis cd ~/redis docker run -id --name=c_redis \ -p 6379:6379 \ redis:5.0
   | 
 
# Dockerfile
# Docker 镜像原理
- Docker 镜像的本质是文件
 
- Docker 镜像是由特殊的文件系统叠加而成
 
- 最低端是 bootfs,并使用宿主机的 bootfs
 
- 第二层是 root 文件系统 rootfs,称为 base image
 
- 然后再往上可以叠加其他的镜像文件
 
- 统一文件系统 (Union File System) 技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户看来,只存在一个文件系统。
 
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像称为基础镜像。
 
- Docker 中的镜像都是只读镜像。
 
- 当从一个镜像启动容器时,Docker 会在最顶层加载一个读写文件系统作为容器。
 
# Docker 镜像制作
1. 容器转为镜像:
1 2 3 4
   | docker commit 容器id 镜像名称:版本号			#转为镜像 docker save -o 压缩文件名称 镜像名称:版本号	  #将镜像压缩,便于发送给别人 docker load -i 压缩文件名称				  #解压缩 #需要注意,挂载的文件不会被commit转为镜像
   | 
 
2.dockerfile 关键字:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | FROM  MAINTAINER  LABEL  RUN  CMD  ENTRYPOINT  COPY  ADD  ENV  ARG  VOLUME  EXPOSE  WORKDIR  USER  HEALTHCHECK  ONBUILD  STOPSIGNAL  SHELL 
   |