1.参考资料
官方文档:https://docs.docker.com/docker-for-windows/
仓库地址:https://hub.docker.com/
2.Docker 的安装
2.1.docker的组成部分
-
镜像(image):docker镜像好比一个模板,可以通过这个模板来创建容器(container),一个镜像可以创建多个容器,类似java中的Class
-
容器(container):类似java中通过Class创建的实例;容器可以理解为一个简易的linux系统
-
仓库(repository):存放镜像的地方,
分为共有仓库和私有仓库
-
Docker Hub:国外的
-
阿里云:配置镜像加速
-
2.2.环境准备
我们要有一台服务器,并且可以操作它
-
Linux命令基础
-
CentOS 7
-
使用Xshell链接远程服务器(免费版即可)
2.3. 安装docker
https://docs.docker.com/engine/install/centos/
卸载旧的版本
$ sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
安装基本的安装包
$ sudo yum install -y yum-utils
设置镜像的仓库
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的
$ sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里云镜像
安装docker引擎
yum makecache fast
安装docker引擎
yum install docker-ce docker-ce-cli containerd.io # docker-ce 社区版 ee 企业版
CentOS 8中安装Docker出现和Podman冲突
yum erase podman buildah
继续执行安装即可
2.4.启动docker
systemctl start docker # 代表启动成功
docker version
docker run hello-world
docker images
2.5.卸载Docker
# 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 删除资源
rm -rf /var/lib/docker # docker 的默认工作路径
3.docker 常用命令
以上已经用到了一些相关命名下面整体介绍一下。
命令参考地址:
https://docs.docker.com/engine/reference/commandline/docker/
3.1. 全局命令
docker version # 显示docker的基本信息
docker info # 系统信息,镜像和容器的数量
docker 命令 --help # 全部信息
3.2.镜像命令
3.2.1.docker images
docker images # 查看所有本地主机上的镜像
--all , -a Show all images (default hides intermediate images) # 显示所有
--digests Show digests
--filter , -f Filter output based on conditions provided
--format Pretty-print images using a Go template
--no-trunc Don’t truncate output
--quiet , -q Only show numeric IDs # 只显示id
3.2.2. docker search
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don‘t truncate output
3.2.3.docker pull
docker pull mysql # 下载mysql镜像,default tag,默认最新版latest
# 指定版本下载
docker pull mysql:5.7
分层下载的好处是:不同的版本相同的部分不用重新下载。
3.2.4. docker rmi
# 删除一个 可以通过名称 也可以指定id -f表示删除所有
docker rmi -f d1165f221234
# 删除多个 用空格分隔id
docker rmi -f id id id
# 删除所有
docker rmi -f $(docker images -aq) # images -aq就是查所有镜像id,从而递归删除
3.2.容器命令
有了镜像才能创建容器,linux,下载一个centos镜像来测试学习
3.2.1.新建容器并启动
docker run [可选参数] image
# 参数说明
# --name=“Name” # 容器名字,用于区分容器
# -it 使用交互方式运行,进入容器查看内容
# -d 后台运行
# -p 端口映射 主机端口::容器端口
# -v 卷挂载
# -e 配置
# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
3.2.2.进入容器
docker exec -it 1de87c606832 /bin/bash
# docker attach 1de87c606832
区别
docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach 进入容器正在执行的终端,不会启动新的进程
# 查看目录
ls
3.2.3.查看容器
# 查看正在运行的容器
docker ps
# 查看曾经运行的容器
docker ps -a
# 显示最近创建的容器,设置显示个数
docker ps -a - n=?
# 只显示容器的编号
docker ps -aq
3.2.4.退出容器
# 容器停止退出
exit
# 容器不停止退出 注意必须在英文输入法下,中文输入法不行
Ctrl + P + Q
3.2.5.删除容器
# 删除指定容器 不能删除正在运行的容器,如果强制删除 rm -f
docker rm 容器id
# 删除所有容器
docker rm -f $(docker ps -aq)
# 删除所有容器
docker ps -a -q|xargs docker rm
3.2.6.导入导出
docker export $CONTAINER_ID > ubuntu.tar
$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1
3.2.7.自动重启
docker run --restart=always 容器id(或者容器名称)
#no - container:不重启
#on-failure - container:退出状态非0时重启
#always:始终重启
docker update --restart=always 容器id(或者容器名称)
3.2.8.相关状态
docker start $CONTAINER_ID
docker restart $CONTAINER_ID
docker stop $CONTAINER_ID
docker kill $CONTAINER_ID
3.3.常用其他命令
3.3.1.后台启动docker
docker run -d 镜像名
# 用docker ps 查看的时候 发现停止了
# 后台运行,docker发现前台没有,容器启动后,发现自己没有提供服务,会立刻停止
3.3.2.查看日志
docker logs
docker logs -f --tail=20 $CONTAINER_ID #查看最新20行
3.3.3.查看容器信息
docker inspect $CONTAINER_ID
3.3.4.文件copy
容器copy 到主机
docker cp $CONTAINER_ID:路径 空格 主机路径
docker cp 83b0be074d94:/etc/mysql /home
主机copy 到容器
docker cp 主机路径 空格 $CONTAINER_ID:路径
后面我们会遇到 卷
3.3.5.任务管理器
docker stats
4.容器数据卷
在Docker中,要想实现数据的持久化,数据就不应该在容器中,否则容器删除,数据就会丢失。故容器之间要有一个数据共享技术,把Docker容器中产生的数据,同步到本地,这就是卷技术。
优点
-
容器的持久化和同步操作
-
容器间可以数据共享
4.1.使用数据卷
目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:
(1)volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)
(2)bind mounts:意为着可以存储在宿主机系统的任意位置;(比较常用的方式)
但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。
(3)tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式)
4.1.1.命令挂载
docker run -it -v -p /宿主机绝对路径:/容器内目录:权限 镜像名
# -it 交互式进入
# -v volume卷技术
# -p 主机端口
# 挂载
docker run -d -p 3306: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 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置 安装启动mysql需要配置密码
--name 容器名字
主机目录/home/mysql/conf与/etc/mysql/conf容器目录同步。
查看其信息
soruce:主机地址
destination:容器地址
4.1.2.匿名与具名挂载
匿名挂载:卷挂载只写容器里面的路径,不写容器外的路径。
# -v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
具名挂载:就是挂载的卷陪一个自己的名字,可以方便的查找
# -v 卷名:/容器内路径
docker run -d -P --name nginx01 -v wyl-nginx:/etc/nginx nginx
docker inspect 6d4a76d84a35
4.1.3.查看卷信息
docker volume inspect wyl-nginx
4.1.4.改变文件的读写权限
# ro: readonly
# rw: readwrite
# 指定容器对我们挂载出来的内容的读写权限
docker run -d -P --name nginx01 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v nginxconfig:/etc/nginx:rw nginx
4.2.查看所有的数据卷
docker volume ls
4.3.共享卷
docker run -it --name nginx03 --volumes-from nginx02 nginx:latest
nginx03继承nginx02的volumes
可以验证,在nginx02下加一个数据,在nginx03下也会出现
删除容器共享文件不会删除。
5.dockerFile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
5.1.命令
FROM # 基础镜像 比如centos
MAINTAINER # 镜像是谁写的 姓名+邮箱
RUN # 镜像构建时需要运行的命令
ADD # 添加,比如添加一个tomcat压缩包
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 指定暴露端口,跟-p一个道理
RUN # 最终要运行的
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,而且可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承Dockerfile 这个时候运行ONBUILD指定,触发指令
COPY # 将文件拷贝到镜像中
ENV # 构建的时候设置环境变量
5.2.创建centos
5.2.1.创建dockerfile
# 进入home目录
cd /home
# 创建一个目录,之后的东西都保存到这里
mkdir dockerfile
# 进入这个目录
cd dockerfile/
# 创建一个dockerfile,名字叫mydockerfile
vim mydockerfile-centos
FROM centos
MAINTAINER wyl<1714404171@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 8088
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
5.2.2.docker build
cd /home/docerfile
docker build -t mycentos -f mydockerfile-centos .
后面的点不要忘记
6.Docker Compose
前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知.对此我们就可以来学习一下docker compose
它是一个用于定义和运行多容器 Docker 的应用程序工具
6.1. compose安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
or
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
pip安装
sudo pip install docker-compose
6.2.权限
sudo chmod +x /usr/local/bin/docker-compose
6.3.Compose 使用
三个步骤:
-
使用 Dockerfile 定义应用程序的环境。
FROM java:8 VOLUME /tmp ADD docker-demo.jar app.jar RUN bash -c ‘touch /app.jar‘ EXPOSE 9000 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
-
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
Compose和Docker兼容性: Compose 文件格式有3个版本,分别为1, 2.x 和 3.x 目前主流的为 3.x 其支持 docker 1.13.0 及其以上的版本 常用参数: version # 指定 compose 文件的版本 services # 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称 build # 指定包含构建上下文的路径, 或作为一个对象,该对象具有 context 和指定的 dockerfile 文件以及 args 参数值 context # context: 指定 Dockerfile 文件所在的路径 dockerfile # dockerfile: 指定 context 指定的目录下面的 Dockerfile 的名称(默认为 Dockerfile) args # args: Dockerfile 在 build 过程中需要的参数 (等同于 docker container build --build-arg 的作用) cache_from # v3.2中新增的参数, 指定缓存的镜像列表 (等同于 docker container build --cache_from 的作用) labels # v3.3中新增的参数, 设置镜像的元数据 (等同于 docker container build --labels 的作用) shm_size # v3.5中新增的参数, 设置容器 /dev/shm 分区的大小 (等同于 docker container build --shm-size 的作用) command # 覆盖容器启动后默认执行的命令, 支持 shell 格式和 [] 格式 configs # cgroup_parent # container_name # 指定容器的名称 (等同于 docker run --name 的作用) credential_spec # deploy # v3 版本以上, 指定与部署和运行服务相关的配置, deploy 部分是 docker stack 使用的, docker stack 依赖 docker swarm endpoint_mode # v3.3 版本中新增的功能, 指定服务暴露的方式 vip # Docker 为该服务分配了一个虚拟 IP(VIP), 作为客户端的访问服务的地址 dnsrr # DNS轮询, Docker 为该服务设置 DNS 条目, 使得服务名称的 DNS 查询返回一个 IP 地址列表, 客户端直接访问其中的一个地址 labels # 指定服务的标签,这些标签仅在服务上设置 mode # 指定 deploy 的模式 global # 每个集群节点都只有一个容器 replicated # 用户可以指定集群中容器的数量(默认) placement # replicas # deploy 的 mode 为 replicated 时, 指定容器副本的数量 resources # 资源限制 limits # 设置容器的资源限制 cpus: "0.5" # 设置该容器最多只能使用 50% 的 CPU memory: 50M # 设置该容器最多只能使用 50M 的内存空间 reservations # 设置为容器预留的系统资源(随时可用) cpus: "0.2" # 为该容器保留 20% 的 CPU memory: 20M # 为该容器保留 20M 的内存空间 restart_policy # 定义容器重启策略, 用于代替 restart 参数 condition # 定义容器重启策略(接受三个参数) none # 不尝试重启 on-failure # 只有当容器内部应用程序出现问题才会重启 any # 无论如何都会尝试重启(默认) delay # 尝试重启的间隔时间(默认为 0s) max_attempts # 尝试重启次数(默认一直尝试重启) window # 检查重启是否成功之前的等待时间(即如果容器启动了, 隔多少秒之后去检测容器是否正常, 默认 0s) update_config # 用于配置滚动更新配置 parallelism # 一次性更新的容器数量 delay # 更新一组容器之间的间隔时间 failure_action # 定义更新失败的策略 continue # 继续更新 rollback # 回滚更新 pause # 暂停更新(默认) monitor # 每次更新后的持续时间以监视更新是否失败(单位: ns|us|ms|s|m|h) (默认为0) max_failure_ratio # 回滚期间容忍的失败率(默认值为0) order # v3.4 版本中新增的参数, 回滚期间的操作顺序 stop-first #旧任务在启动新任务之前停止(默认) start-first #首先启动新任务, 并且正在运行的任务暂时重叠 rollback_config # v3.7 版本中新增的参数, 用于定义在 update_config 更新失败的回滚策略 parallelism # 一次回滚的容器数, 如果设置为0, 则所有容器同时回滚 delay # 每个组回滚之间的时间间隔(默认为0) failure_action # 定义回滚失败的策略 continue # 继续回滚 pause # 暂停回滚 monitor # 每次回滚任务后的持续时间以监视失败(单位: ns|us|ms|s|m|h) (默认为0) max_failure_ratio # 回滚期间容忍的失败率(默认值0) order # 回滚期间的操作顺序 stop-first # 旧任务在启动新任务之前停止(默认) start-first # 首先启动新任务, 并且正在运行的任务暂时重叠 注意: 支持 docker-compose up 和 docker-compose run 但不支持 docker stack deploy 的子选项 security_opt container_name devices tmpfs stop_signal links cgroup_parent network_mode external_links restart build userns_mode sysctls devices # 指定设备映射列表 (等同于 docker run --device 的作用) depends_on # 定义容器启动顺序 (此选项解决了容器之间的依赖关系, 此选项在 v3 版本中 使用 swarm 部署时将忽略该选项)
-
最后,执行 docker-compose up 命令来启动并运行整个应用程序。
docker-compose up docker-compose up -d // 后台启动并运行容器
6.3.卸载
# pip卸载
pip uninstall docker-compose
6.4.常用命令
7.docker network
默认情况下容器与容器、容器与宿主机的网络是隔离开来的,
当你安装docker的时候,docker会创建一个桥接器docker0,通过它才让容器与容器、容器与宿主机之间通信。
Docker安装的时候默认会创建三个不同的网络,你可以通过命令查看这些网络。
docker network ls
#帮助命令后显示下面信息
[root@vultrguest ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Options:
--help Print usage
Commands:
connect 将某个容器连接到一个docker网络
create 创建一个docker局域网络
disconnect 将某个容器退出某个局域网络
inspect 显示某个局域网络信息
ls 显示所有docker局域网络
prune 删除所有未引用的docker局域网络
rm 删除docker网络
Run ‘docker network COMMAND --help‘ for more information on a command.
7.1.默认网络
7.1.1.None Network
网络模式为none的,即不会为容器创建任何的网络环境。
一旦Docker Container采用了none网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。
7.1.2.Host Network
如果你在创建容器的时候使用--network=host
选项,那么容器会使用宿主机的网络,容器与宿主机的网络并没有隔离。
使用这种网络类型的好处就是网络性能很好,基本上跟宿主机的网络一样,它很大的弊端就是不安全。
你可以在容器中更改宿主机的网络,如果你的程序是用root用户运行的,有可能会通过Docker容器来控制宿主机的网络。
当我们在容器中执行类似ifconfig命令查看网络环境是,看到的都是宿主机上的信息。
7.1.3.Bridge Network
桥接网络是默认的网络类型,我们可以使用下面的命令来查看默认的网络配置信息。
这儿桥接的网络名为docker0
。当我们启动一个容器的时候,每个容器会有它自己的虚拟网络接口连接到docker0
,并获得一个IP地址。
7.2.自定义网络
7.2.1创建网络
docker network create mynet
7.2.2.把容器加入局域网
#运行redis容器
docker run -itd --name redis --network mynet --network-alias redis -p 6379:6379 redis
#运行nginx容器
docker run -d --name nginx -p 8081:8081 --network mynet --network-alias nginx --privileged=true -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs nginx
7.2.3.查看mynet 信息
7.2.4.docker network connect
也可以不指定网络,直接启动容器,然后使用docker network connect接入网络
docker network connect mynet nginx
docker network connect mynet redis
7.2.5.移除局域网
docker network disconnect mynet nginx