1.docker与虚拟机技术的不同
- 传统虚拟机:虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
- 容器内的应用直接运行在,宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件
- 每个容器是相互隔离,每个容器内都有一个属于自己的文件系统,互不影响。
2.docker基本命令
2.1 重新加载docker
systemctl daemon-reload
2.2 重启docker
systemctl restart docker
2.3 查看镜像
- REPOSITORY : 镜像在仓库中的名称
- TAG:镜像标签
- IMAGE ID:镜像ID
- CREATED:镜像的创建日期
- SIZE:镜像大小
2.4 搜索镜像
如果需要下载镜像,但是又不知道docker是否存在此镜像,就可以通过搜索镜像命令进行查看
docker search mysql
增加filters过滤选项
docker search mysql --filter=STARTS=3000
2.5 拉取镜像
拉取镜像就是从中央仓库下载镜像到本地
docker pull 镜像名称:tag
2.6 删除镜像
docker rmi 镜像id
docker rmi 镜像名称
docker rmi 镜像名称:tag
删除镜像的时候,必须保证没有镜像被使用,也就是没有通过镜像创建容器,如果有,则必须先删除容器
docker images -q 可以查询到所有镜像ID
2.7 查看正在运行的容器
docker ps
- CONTAINER ID:容器ID
- IMAGE :所属镜像
- COMMAND:命令
- CREATED:创建时间
- STATUS:容器状态up运行,existed退出
- PORTS:端口
- NAME:容器名称
2.8 查看容器
docker ps -a
查看已经退出的容器
docker ps -f status-exited
查看最后一次运行的容器
docker ps -l
2.9 退出容器
exit # 直接容器停止并退出
ctrl + p + Q # 容器不停止退出
2.10 查看日志
-tf # 显示日志
-tail number # 要显示日志参数
docker logs -tf --tail 10 dceefaf
2.11 容器启动命令
docker run [options] IMAGES [COMMAND] [ARG..]
- -it 使用交互方式运行,进入容器查看内容
-
- –name :为创建的容器命名
- -v :表示目录映射关系,前者是宿主机目录,后者是映射到宿主机上的目录,可以使用多个-v做多个目录或文件映射。
- -d 后台运行
- -p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口,可以使用多个-p做多个端口映射
docker run -it centos /bin/bash
例如:
docker run -it --name 容器名称 镜像名称:标签 /bin/bash
Docker容器必须有一个前台进程,如果没有前台进程执行,容器则认为空闲状态,就会自动退出
守护方式创建容器
docker run -di --name 容器名称 镜像名称:标签
此方式创建完成后,会启动容器,但不会进入容器,容器一直运行,除非使用docker stop命令关闭容器
docker run -id --name m_mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
如果-d进入centos,会自动停止
2.12 守护方式进入容器
docker exec -it 容器名称|容器ID /bin/bash
2.13 停止启动容器
docker stop 容器名称 | 容器ID
# 启动容器
docker start 容器名称 | 容器ID
docker stop 容器id
docker kill 容器id
2.14 文件拷贝
docker cp 容器名称:目录 宿主机目录
2.15 匿名挂载
匿名挂载只需要写容器目录即可,宿主机对应的目录会在/var/lib/docker/volumes 中生成
docker run -di -v /usr/local/data --name centos7-02 centos:7
docker volume ls
2.16 具名挂载
具名挂载就是给数据卷起了个名字,容器外对应的目录在/var/lib/docker/volume 中生成
docker run -di -v docker_centos_data:/usr/local/data --name centos7-03 centos:7
# 查看volume 数据卷信息
docker volume ls
2.17 镜像其他相关操作
使用docker save 将指定镜像保存成tar归档文件
docker save [OPTIONS] IMAGE [IMAGE..]
docker save -o /root/mycentos7.tar mycentos:7
2.18 镜像恢复
使用docker load导入docker save命令导出的镜像归档文件
docker load [OPTIONS]
docker load -i mycentos7.tar
- –input, -i :指定导入的文件
- –quiet ,-q:精简输出信息
2.19 上传公有仓库
docker login
docker tag mscentos:7 mszlu/testmszlu:1.0
docker push mszlu/testmszlu:1.0
2.20 拉取镜像
docker pull mszlu/test-centos:1.0.0
2.21 退出登录
docker logout
2.22 创建私有仓库容器
docker run -di --name registry -p 5000:5000 -v /mnt/docker/docker_registry:/var/lib/registry/registry
- -d:后台运行容器
- –name 为创建的容器命名
- -p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口,可以使用多个-p 做多个端口映射
- -v 将容器内/var/lib/registry/目录下的数据挂载至宿主机 /mnt/docker/docker_registry 目录下:
2.23 推送镜像至私有仓库
2.24 创建私有仓库
2.25 推送镜像至私有仓库
先给镜像设置标签 docker tag local-image:tagname new-repo:tagname
再将镜像推送至私有仓库 docker push new-repo:tagname
3.实例
例1:关闭的docker容器,启动
第一行命令守护方式进入,第二行启动
docker start 97f5e
docker attach 97f5e
例2:安装mysql
docker pull mysql:5.7
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
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:5.7
例3:安装tomcat
docker run -it --rm tomcat:9.0
docker pull tomcat
docker run -d -p 3355:8080 --name tomcat01 tomcat
docker exec -it tomcat01 /bin/bash
例4:构建一个commit镜像
docker ps
docker commit -a "aa" -m "cc" 9f75e2f4b917 mcent:1.0docker run -it --name nkxcentos -p 80:80 mcent:1.0
- -a:提交的镜像作者
- -c 使用dockerfile指令来创建镜像
- -e 提交时的说明文字
- -p 在commit时,将容器暂停
例5:tomcat部署
- 拉取镜像
docker run -di --name tomcat -v /mnt/docker/data/webapps:/user/local/tomcat/webapps -p 8080:8080 tomcat
- 在webapps下添加ROOT文件夹,其中添加一个index.html
- 访问http://ip:8080/index.html即可
例6:mysql部署
例7:redis部署
例8 创建centos镜像
mkdir -p /mnt/docker/dockerfile
cd /mnt/docker/dockerfile
vim Dockerfile
docker build -f ./Dockerfile -t mscentos:7 .
docker run -id --name mscentos -p 8080:8080 mscentos:7
dockerfile编写
FROM centos
VOLUME ["volume01","volume02"]CMD echo "----end---"
CMD /bin/bash
4.DockerFile
4.1 编写规则
FROM #基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包,添加内容
WORKDIR #镜像的工作目录
VOLUME # 挂载的目录
EXPOST # 保留端口配置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承dockerfile这个时候运行onbuild的指令,触发指令
COPY #类似ADD,将我们文件拷贝到镜像中
ENY # 构建的时候设置环境变量
5.Docker总结
5.Docker数据卷
5. 1 具名挂载
docker run -it -v /home/ceshi:/home centos /bin/bash
通过docker volume inspect 数据卷名称 可以查看该数据卷对应宿主机的目录地址
docker volume inspect docker_centos_data
5.2 只读/读写
只读 只能通过修改宿主机内容实现对容器的数据管理
docker run -it -v /宿主机目录:/容器目录:ro 镜像名
# 读写默认,宿主机和容器可以双向操作数据
docker run -it -v /宿主机目录 :/容器目录:rw 镜像名
5.3 数据卷容器 (数据卷继承)
多个容器数据间共享
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
docker run -di --volumes-from centos7-01 --name centos7-04 centos:7
docker run -di --volumes-from centos7-01 --name centos7-05 centos:7
5.4 查看容器ip地址
docker inspect 容器名称|容器ID
5.5 删除容器
docker rm 容器名称| 容器ID
docker rm 容器名称|容器ID 容器名称|容器id
6.Docker File常用指令
6.1 FROM
指明构建的新镜像是来自于哪个基础镜像,如果没有选择tag,那么默认值为latest
6.2 MAINTAINER
指明镜像维护者及其联系方式(一般是邮箱地址)。官方说明已过时,推荐使用LABEL
MAINTAINER mszlu <mszlu.com>
6.3 LABEL <key>=<value> <key>=<value> <key>=<value>
功能为镜像指定标签,也可以使用LABEL来指定镜像作者
LABEL maintainer="mszlu.com"
6.4 RUN
构建镜像运行的Shell命令,比如构建的新镜像中我们想在/usr/local目录下创建一个java目录
RUN mkdir -p /usr/local/java
6.5 ADD …
拷贝文件或目录到镜像中,src可以是一个本地文件或者是一个本地压缩文件,压缩文件会自动解压,还可以是一个url,如果把src写成一个url,那么ADD就类似于wget命令,然后自动下载和解压
ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
6.6 COPY
拷贝文件或目录到镜像中,用法同ADD,只是不支持自动下载和解压
COPY jdk -11.0.6_linux-x64_bin.tar.gz /usr/local/java
6.7 EXPOSE
暴露容器运行的监听端口给外部,可以指定端口是监听TCP还是UDP,如果未指定协议,则默认为TCP
EXPOSE 80 443 8080/tcp
如果想使得容器与宿主机的端口有映射关系,必须在容器启动的时候加上-p 参数
6.8 ENV
设置容器内环境变量
ENV JAVA_HOME /usr/local/java/jdk-11.0.6/
6.9 ENTRYPOINT
ENTRYPOINT [“executable”,“param1”,“param2”]
启动容器时执行的shell命令,同CMD类似,不会被docker run命令指定的参数所覆盖,在dockerfile中只能有一条entrypoint指令,如果设置了多条entrypoint只有最后一条entrypoint会生效
6.10 WORKDIR
WORKDIR /path/to/workdir
为run,CMD,ENTRYPOINT以及COPY和AND设置工作目录
WORKDIR /usr/local
指定容器挂载点到宿主机自动生成目录和其他容器,一般的使用场景为需要持久化存储数据
6.11 VOLUME
容器的/var/lib/mysql 目录会在运行时自动挂载为匿名卷,匿名卷在宿主机的/var/lib/docker/volumes目录下
7. Docker网络
7.1 默认网络
装docker以后,网络有3种,
网络模式 | 简介 |
---|---|
bridge | 为每一个容器分配,设置IP等,并将容器连接到一个docker0虚拟网桥,默认为该模式 |
host | 容器将不会虚拟自己的网卡,设置自己的IP等,而是使用宿主机的IP和端口 |
nonr | 容器有独立的Network namespace 但并没有对其进行任何网络设置,如分配vethpair和网桥连接,IP等 |
container | 新创建的容器不会创建自己的网卡和设置自己的IP而是和一个指定的容器共享IP,端口范围等 |
docker run -it --name bbox04 --net container:bbox01 busybox
7.2 断开网络
docker network disconnect custom_network bbox05
7.3 移除网络
可以通过 命令移除自定义网络模式
docker network rm custom_network
7.4 容器间网络通信
docker run -di --name default_bbox01 busybox
docker run -di --name default_bbox02 busybox
docker network inspect bridge
docker exec -it default_bbox01 ping 172.17.0.4
容器名称间通信
docker run -di --name custom_bbox01 --net m_network busybox
docker network ls
docker run -di --name custom_bbox02 --net m_network busybox
docker exec -it custom_bbox01 ping custom_bbox02
DockerCompose
services
services用来定义服务器,可以多个,每个服务中定义了创建容器时所需的镜像,参数,依赖等,就像将命令行参数传递给docker run一样,同样,网络和数据卷的定义也是一样的。
比如,之前我们通过docker run命令构建一个MySQL应用容器的命令如下:
docker run -di --name mysql8 -p 3306:3306 -v
/mydata/docker_mysql/conf:/etc/mysql/conf.d -v
/mydata/docker_mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:8
使用docker-compose.yml来定义
version "3.8"
services:mysqlimage:mysql:8container_name:mysql8ports:-"3306:3306"encironment:MYSQL_ROOT_PASSWORD:134volumes:- "/mydata/docker_mysql/conf:/etc/mysql/conf.d"-
然后通过docker-compose 相关命令即可完成容器的创建,停止或删除等一系列操作
image
指定创建容器时所需的镜像名称标签或者镜像ID,如果镜像在本地不存在,会去远程拉取
services:web:image:hello-world
build
除了可以基于指定的镜像构建容器,还可以基于Dockerfile文件构建,在使用up命令时会执行构建任务
通过build配置项可以指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器
build配置项可以使用绝对路径,也可以使用相对路径
/usr/local/docker-centos
context
该选项可以是Dockerfile文件的绝对/相对路径,也可以是远程Git远程的url,当提供的值是相对路径时,相对当前docker-compose.yml 文件所在的目录
build :context:
dockerfile
一般情况下,默认都基于文件名叫Dockerfile的文件构建镜像,当然可以是自定义文件名,使用dockerfile声明,不过这个选项只能声明文件名,文件所在路径还是通过context来声明
build:context:.dockerfile:Dockerfile-alternate
container_name
Compose 创建的容器默认生成的名称格式为: 工程名称_服务条目名称_序号,如果要使用自定义名称,使用container_name声明
services:mycentos:build:container_name:mycentos # 容器名称,默认为"工程名称_服务条目名称_序号"
因为Docker容器名称必须是唯一的,所以如果指定了自定义名称,就不能将服务扩展至多个容器。这样做可能会导致错误
序号
version "3.8"
services:testseq: # 服务名称image: centos:7
然后通过–scale 指定 testseq服务一次性启动3个
docker-compose up -d --scale testseq=3
depends_on
使用Compose最大的好处就是敲最少的命令做更多的事情,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没有数据库容器的情况下启动了web应用容器,应用容器会因为找不到数据库而退出。depends_on就是用来解决容器依赖、启动先后问题的配置项
version:"3.8"
services:web:build:depends_on:-db-redis
redis:image:redis
db:image:mysql
port
容器对外暴露的端口,格式:左边宿主机端口:右边容器端口
ports:-"80:80"- "8080:8080"
expose
容器暴露的端口不映射到宿主机,只允许能被连接的服务器访问
expose:- "80"- "8080"
restart
容器重启策略,简单的理解就是Docker重启以后容器要不要一起启动
- no:默认的重启策略,在任何情况下都不会重启容器
- on-failure:容器非正常退出时,比如退出状态为非0(异常退出),才会重启容器
- always:容器总是重新启动,即使容器被手动停止了,当Docker重启时容器也还是会一起启动;
- unless-stopped:容器总是重新启动,除非容器被停止(手动或其他方式),那么docker重启时容器则不会启动
services:nginx:image:nginxcontainer_name:mynginxports:- "80:80"restart: always
environment
添加环境变量,可以使用数组也可以使用字典,布尔相关的值(true,false,yes,no)都需要用引号括起来,以确保YML解析器不会将它们转换为真或假
environment:RACK_ENV: developmentSHOW:"true"SESSION_SECRET:
env_file
从文件中获取环境变量,可以指定一个或多个文件,其优先级低于environment指定的环境变量
env_file:- /opt/runtime_opts.env # 绝对路径- ./common.env # 相对路径,相对当前docker-compose.yml 文件所在的目录- ./apps/web.env # 相对路径,相对当前 docker-compose.yml文件所在的目录
command
覆盖容器启动后默认执行的命令
commannd:echo "helloworld"
该命令也可以是一个列表
command:["echo","helooworld"]
volumes
数据卷用于实现目录挂载,支持指定目录挂载,匿名挂载,具名挂载
- 指定目录挂载的格式为:左边宿主机目录:右边容器目录,或者 左边宿主机目录:右边容器目录:读写权限
- 匿名挂载格式为: 容器目录即可,或者容器目录即可:读写权限;
- 具名挂载格式为:数据卷条目名称:容器目录 或者数据卷条目名称:容器目录:读写权限
version: "3.8" # 描述Compose文件的版本信息
services: # 定义服务,可以多个mysql: # 服务名称image: mysql:8 # 创建容器时所需的镜像container_name: mysql8 # 容器名称,默认为"工程名称_服务条目名称_序号"ports: # 宿主机与容器的端口映射关系- "3306:3306" # 左边宿主机端口:右边容器端口environment: # 创建容器时所需的环境变量MYSQL_ROOT_PASSWORD: 1234volumes:- "/mnt/docker/docker_mysql/data:/var/lib/mysql"# 相对路径,相对当前 docker-compose.yml 文件所在的目录- "./conf:/etc/mysql/conf.d"# 匿名挂载,匿名挂载只需要写容器目录即可,容器外对应的目录会在/var/ib/docker/volume中生成- "/var/lib/mysql"# 具名挂载 就是给数据卷起了名字,容器外对应的目录会在 /var/lib/docker/volume 中生成 # 定义数据卷,可以多个
volumes:
mysql-data-volume:# 一个具有数据卷的条目名称
name:mysql-data-volume # 数据卷名称,默认为"工程名称_数据卷条目名称"
network_mode
设置网络模式,类似docker run 时添加的参数–net host 或者 --network host的用法
network_mode : "bridge"
network_mode :"host"
network_mode:"none"
network_mode:"service:[service name]"
network_mode :"container:[container name/id]"
networks
配置容器连接的网络,引用顶级networks下的条目
# 定义服务,可以多个
services:nginx: # 服务名称networks: # 配置容器连接的网络,引用顶级networks下的条目- nginx-net # 一个具体网络的条目名称
# 定义网络,可以多个,如果不声明,默认会创建一个网络名称“工程名称_default”的bridge网络
networks:nginx-net: # 一个具体网络的条目名称name:nginx-net # 网络名称,默认为"工程名称_网络条目名称"driver:bridge # 网络模式 默认为 bridge
aliases
网络上此服务的别名
同一网络上的其他容器可以使用服务名或此别名连接到服务容器
同一服务在不同的网络上可以具有不同的别名
# 定义服务,可以多个
services:nginx: # 服务名称networks: # 配置容器链接的网络,引用顶级networks下的条目nginx-net: # 一个具体网络的条目名称aliases: # 服务别名 可以多个- nginx1 # 同一个网络上的其他容器可以使用服务名或此别名连接到服务容器
# 定义网络可以多个,如果不声明,默认会创建一个网络名称为,工程名称_default 的bridge网络
networks:nginx-net: # 一个具体网络的条目名称name:nginx-net # 网络名称,默认为"工程名称_网络条目名称"driver:bridge # 网络模式,默认为 bridge
volumes
以下方式的数据卷声明创建卷时会使用默认的名称:“工程名称_数据卷条目名称”
# 描述Compose文件的版本信息
version:"3.8"
# 定义服务 可以多个
services:mysql:image:mysql:8container_name:mysql8ports:-"3306":"3306"environmentMYSQL_ROOT_PASSWORD:1234volumes:- "mysql-data-volume:/var/lib/mysql"# 定义数据卷 可以多个volumes:mysql-data-volume: 一个具体数据卷的条目名称
networks
如果不声明网络,每个工程默认会创建一个网络名称为“”工程名称_default“”的bridge网络
# 描述 Compose 文件的版本信息
version: "3.8"# 定义服务 可以多个
services:mysql:image:nginxcontainer_name:mynginxports:-"80":"80"# 定义网络可以多个,如果不声明,默认会创建一个网络名称为“工程名称_default”的bridge 网络
# 定义服务 可以多个
services:mysql:image:nginxcontainer_name:mynginxports:-"80":"80"networks: "配置容器连接的网络,引用顶级networks下条目"nginx-net:
# 定义网络 可以多个
networks:nginx-net: # 一个具体网络的条目名称name : nginx-net # 网络名称 默认为"工程名称_网络条目名称"driver: bridge # 网络模式,默认为 bridge
Docker Compose 指令简介
docker-compose [-f <arg>...] [options][COMMAND][ARGS...]
部分命令选项如下:
- -f --file:指定使用的compose模版文件,默认为docker-compose.yml 可以多次指定 ,指定多个yml
- -p --project-name :指定工程名称,默认使用docker-compose.yml 文件所在目录的名称;
- -v :打印版本并退出
- –log-level:定义日志等级(DEBUG,INFO,WARNING,ERROR,CRITICAL)
help
docker-compose -help 查看帮助
config
docker -compose config -q 验证 docker-compose.yml 文件。当配置正确时,不输出任何内容,但配置错误时,输出错误信息
pull
docker-compose pull 拉取服务依赖的镜像
# 拉取工程中所有服务依赖的镜像
docker-compose pull
# 拉取工程中nginx服务依赖的镜像
docker-compose pull nginx
# 拉取镜像过程中不打印拉取进度信息
docker-compose pull -q
up
docker-compose up创建并启动所有服务的容器。指定多个yml 加-f 选项。以守护进程模式运行加-d选项
# 前台启动
docker-compose up
# 后台启动
docker-compose up -d
# -f 指定使用的Compose模版文件
logs
docker-compose logs查看服务容器的输出日志。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分,可以通过–no-color来关闭颜色
# 输出日志,不同的服务输出使用不同的颜色来区分
docker-compose logs
# 跟踪日志输出
docker-compose logs -f
# 关闭颜色
docker-compose logs --no-color
ps
docker-compose ps 列出工程中所有服务的容器
run
docker compose run 在指定服务容器上执行一个命令
docker-compose run nginx echo "helloworld"
exec
docker-compose exec 进入服务容器
docker-compose exec nginx bash
pause
docker-compose pause 暂停工程中所有服务的容器
docker-compose pause nginx
unpause
docker-compose unpause 恢复工程中所有服务的容器
restart
docker-compose restart nginx```
stop
docker-compose stop nginx
kill
docker-compose kill nginx
rm
docker-compose rm nginx