# 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
|