Docker快速入门
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!