Docker 基础。
-
- 应用容器技术,操作系统层面的虚拟化技术
- 通俗地可以这样理解(仅作为理解辅助,不用于技术解释)
- 和
VM
之类的虚拟机技术做对比,VM
是系统级别的虚拟技术,安装好的虚拟系统拷走镜像,在另一台机器上可以用VM
打开,系统还是那个系统,一模一样。 - 而
Docker
“虚拟”的大小比系统小,它只是“虚拟”应用和相关环境,打包成镜像(可以理解为刻了一张光盘),然后把镜像拷贝走,在另一台机器上(Windows
、Linux
、MAC
)的Docker
里,可以正常运行。应用的环境一模一样。省去重新安装环境的时间。
- 和
-
-
- 应对场景:开发的时候,在本机测试环境可以跑,生产环境跑不起来
-
- 应对场景:服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因内存不足就挂了
-
- 应对场景:公司举行线上活动,为应对大量的流量,需要多部署几十台服务器
-
-
-
比较项目 VM
Docker
系统携带 √
/
资源(内存)调用流程 虚拟内存->虚拟物理内存->真正物理内存 虚拟物理内存->真正物理内存 磁盘占用 GB
MB
启动速度 分钟 秒 安装管理 专门的运维技术 安装、管理方便 应用部署 费时费力 从第二次部署开始轻松简捷 系统依赖 /
需求相同或相似的内核,推荐 Linux
-
-
Windows
需要开启Hyper-V
- 控制面板 → 程序 → 卸载程序 →启动或关闭
Windows
功能→Hyper-V
(勾选) - 下载
exe
,然后安装到自己喜欢的目录
- 控制面板 → 程序 → 卸载程序 →启动或关闭
Linux
Bash
安装- ❗ 生产环境不建议用这种方法,因为所有配置参数都是默认的,而且下载的是最新的版本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
--mirror Aliyun
,表示用阿里云镜像下载,加快速度
- 其它安装方法官方教程:传送门
- 查看版本信息
docker version
-
- 启动服务
systemctl start docker
- 设置开机启动
systemctl enable docker
- 启动服务
-
- 新建
docker
组groupadd docker
- 将当前用户加入
docker
组usermod -aG docker $USER
-a
仅和-G
一块使用,将用户添加到附属组群-G
,修改用户所属的附加群组
- 重启
Docker
服务systemctl restart docker
- 新建
-
Docker
镜像,就相当于是一个root
文件系统。比如官方镜像ubuntu:16.04
就包含了完整的一套Ubuntu16.04
最小系统的root
文件系统。Docker
镜像是用于创建Docker
容器的模板,比如Ubuntu
系统。- 只读
-
- 容器是独立运行的一个或一组应用,是镜像运行时的实体。
- 一个镜像可以被产生
n
个容器,就代表n
个实例 - 可读写
-
- 保存镜像的远程位置
-
- 在
DockerHub
中搜索mysql
- 下载最新版镜像
docker pull mysql
- 如果下载指定版镜像
docker pull mysql:5.6.51
- 在
-
-
docker run hello-world
hello-world
,镜像名称
-
- 若本地没有发现
hello-world
镜像,则会从远程下载名为hello-world
的镜像 - 然后以镜像为模板生成一个容器
- 若本地没有发现
-
-
-
C
,client
S
,Server
- 可以用其它客户端操作
docker
服务
-
-
-
docker images -q
,只显示镜像id
-
- 在镜像所在目录,
docker load -i mysql.tar
-i
,表示image
- 在镜像所在目录,
-
-
注意
- 如果镜像正在使用中,正常删除会报错
- 此时若还想删除,需要使用强制删除
-
- 根据镜像名[:版本号],
docker image rm mysql
- 根据镜像
ID
删除,docker image rm ae2feff98a0c
docker image rm
可简写为docker rmi
- 根据镜像名[:版本号],
-
- 不仅会删掉镜像,还会删掉与之相关的容器
docker image rm -f mysql
- 删除全部的镜像
docker rmi -f $(docker images -aq)
docker images -aq
,列出所有镜像的ID
$()
表示先执行括号里的,并将括号里的结果作为值给外边的命令使用
-
-
-
docker run 镜像名:tag | 镜像id
docker run mysql:5.6.51
docker run 8391e8f6fea5
-
docker ps
-a
,所有容器,包括运行和非运行的容器-q
,返回正在运行的容器id
-
-p
docker run -p host_port:docker_port mysql:5.6.51
-
-d
-
--name
- 名字唯一
-
stop
,正常停止kill
,立即停止restart
,重启
-
-
docker rm container_name|container_id
-
-f
-
docker rm -f $(docker ps -aq)
-
-
docker logs container_id|container_name
-f
,实时展示日志-t
,显示时间戳--tail n
,查看最后n
行
-
docker top container_id|container_name
-
-
-
docker cp container_id|container_name:inner_file_path host_dir_path
-
docker cp host_file_path container_id|container_name:inner_dir_path
-
-
-
查看
docker
内部细节docker inspect
-
-
作用:
- 实现宿主机系统与容器之前的文件共享
-
-
目录路径必须是绝对路径
-
-v
宿主机目录:
容器内的目录- 这种方式会清空容器内目录的文件
docker run -d -p 8081:8080 --name mytest -v /data/share:/data/share/ tomcat:8.0-jre8
-
docker run -d -p 8081:8080 --name mytest -v the_name_you_like:/data/share/ tomcat:8.0-jre8
the_name_you_like
,此时,容器启动后,会自动在宿主机上创建the_name_you_like
目录- 适合那些需要把数据写在容器外边的服务,如,数据库等
-
-
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改,会立刻影响到对应的容器
- 对数据卷的修改不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
-
- 宿主机可以影响容器,容器不能影响宿主机,
ro
docker run -d -p8990:8080 --name mysql_container -v /root/apps:/usr/local/mysql:ro mysql:5.6.51
- 宿主机可以影响容器,容器不能影响宿主机,
-
-
docker volume ls
-
docker volume inspect
-
docker volume create volume_name
-
-
docker volume prune
-
docker volume rm volume_name
-
-
docker commit -m"描述信息"-a"作者信息" 容器id|容器名称 打包成的镜像名称:标签名
docker commit -m"测试库MySQL" -a"maixiaochai" mysql mysql-test:1.0
docker save 镜像名称:Tag -o 文件名
docker save mysql-test:1.0 -o mysql-test-1.0.tar
docker
的镜像实际是由一层一层的文件系统组成bootfs
rootfs
UnionFS
,联合文件系统- 最大的好处是资源共享
-
docker
允许通过外部访问容器或容器互联的方式来提供网络服务 -
docker
容器与操作系统通信机制docker
启动时会自动在主机上创建一个虚拟网桥(bridge
)- 创建一个新容器的时候会创建一对
veth port
接口,一端在容器内,另一端在本地被挂载到网桥- 当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包
-
-
一般在使用
docker
网桥时不使用默认的公共网桥,容易影响其它容器的网络使用,而是站在同一个应用的角度设置网桥 -
-
docker network ls
-
docker network create mysql_bridge
- 等价于
docker network create --driver bridge mysql_bridge
--driver
, 网络类型
- 等价于
-
docker run -d -p 8081:8080 --name mysql01 --network mysql_bridge mysql:5.6.51
- 注意,此时,容器的名字
mysql01
和容器的ip
自动进行了映射,在同一网桥下访问容器的名字即可访问到容器
- 注意,此时,容器的名字
-
docker network rm the_bridge_name
-
docker inspect the_bridge_name
-
-
-
- 在
DockerHub
上搜索,然后pull
- 查看描述信息,了解使用方法
docker run --name mysql -e MYSQL_ROOT_PASSWORD=maixiaochai -d -p 3306:3306 -v mysqldata:/var/lib/mysql -v mysqlconfig:/etc/mysql mysql:tag
- --name,容器名称
- -e,后边接要给容器配置的环境变量
MYSQL_ROOT_PASSWORD=maixiaochai
,设置MySQL的root密码为maixiaochai
- -d,表示可后台运行
- -p,端口映射(宿主机端口号:容器端口号)
- -v,映射数据卷,将数据文件保存在宿主机
- /var/lib/mysql,MYSQL镜像中默认数据保存目录
- -v mysqlconfig:/etc/mysql,将MySQL配置文件保存的目录映射出去,使得MYSQL重启的时候能加载自定义配置
- 在
-
docker run -d -p 6379:6379 --name redis -v redisdata:/data -v myredis/conf/:/usr/local/etc/redis/ redis:5.0.10 redis-server --appendonly yes /usr/local/etc/redis/redis.conf
redis-server --appendonly yes
,开启持久化-v redisdata:/data
,将持久化目录映射到宿主机/usr/local/etc/redis/redis.conf
,使用redis.conf
这里边的配置- 配置文件从redis源码中找一个改一改,然后放到被映射的宿主机配置目录
-
-
- 创建一个目录(构建上下文目录),目录中创建
Dockerfile
文件,名字推荐用Dockerfile
- 在执行
build
命令之后,会将内容打包发送到server端,进行层层镜像创建 - 中间创建的镜像会保存到缓存中,方便修改后快速构建
- 创建一个目录(构建上下文目录),目录中创建
-
FROM
,当前镜像基于哪个镜像RUN
,构建镜像时需要运行的命令EXPOSE
,当前容器对外暴露出的端口WORKDIR
,指定在创建容器后,终端默认登录进来的工作目录,一个落脚点- 如果
WORKDIR
不存在,即使它在没有任何后续Dockerfile
指令中使用,他也将被创建 WORKDIR
可以在Docker
中多次使用,如果提供了相对路径,则该路径将与先前WORKDIR
指令的路径相对
- 如果
ENV
,用来在构建过程中设置环境变量- 以后可以复用
- 在运行容器的时候可以设置环境变量
ADD
,将宿主机目录下的文件拷贝进镜像且ADD
命令会自动处理URL和解压tar包(下载的压缩包不能解压)COPY
,类似于ADD
,拷贝文件和目录到镜像中,将从构建上下文目录中<原路径>的文件或目录复制到新的一层的镜像内的<目标路径>位置VOLUME
,容器数据卷,用于数据保存和持久化工作,-v
的容器端
-
CMD
,指定一个容器启动时要运行的命令,Dockerfile
中可以有多个CMD
命令,但只有最后一个生效,CMD
会被docker run
之后的参数替换 -
ENTRYPOINT
,指定一个容器启动时要运行的命令,ENTRYPOINT
的目的和CMD
一样,都是在指定容器启动程序及其参数 -
-
mkdir mydocker && cd mydocker
-
vim Dockerfile
-
FROM centos:7 RUN yum install -y vim EXPOSE 8080 EXPOSE 15672 WORKDIR /data ENV CORE_DATA_DIR /data/coredata COPY a.txt /data/files ADD https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-10/v10.0.2/bin/apache-tomcat-10.0.2.tar.gz /data/packages ADD pandas‑1.2.2‑cp39‑cp39‑win_amd64.whl /data/pylibs ADD apache-tomcat-10.0.2.tar.gz /data/softwares RUN cd /data/softwares && mv apache-tomcat-10.0.2 tomcat VOLUMN $CORE_DATA_DIR ENTRYPOINT ["ls"] CMD ["/data/coredata"]
-
-
docker build -t mycentos7:01 .
- -t,指定仓库名称和版本(镜像名称和版本)
.
,当前目录,Dockerfile
所在目录
-
COPY a.txt /data/files
,拷贝当前目录下的a.txt到 镜像的/data/files目录下 -
ADD apache-tomcat-10.0.2.tar.gz /data/softwares RUN cd /data/softwares && mv apache-tomcat-10.0.2 tomcat
- 在解压之后,重命名
-
ENTRYPOINT ["ls"] CMD ["/data/coredata"]
- 在
docker run mycentos7:2
时,会默认打印/data/coredata
下的对象 - 同时,CMD后面的内容可由run后边的参数覆盖,如
docker run mycentos7:2 /data/packages
,/data/packages
会覆盖CMD后边的内容,执行的时候会打印/data/packages
下的对象
- 在
-
-
-
-
Compose
项目是Docker
官方的开源项目,负责实现对Docker
集群的快速编排- 通过一个单独的
docker-compose.yml
- 通过一个单独的
-
定位,定义和运行多个
docker
容器的应用,同时可以对多个容器进行编排
-
-
-
服务(
service
):一个容器,实际上可以包括若干运行相同镜像的容器实例 -
项目(
project
):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml
文件中定义
-
-
-
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
-
sudo chmod +x /usr/local/bin/docker-compose
-
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
-
-
docker-compose -v
- 成功后显示:
docker-compose version 1.28.4, build cabd5cfb
- 成功后显示:
-
-
-
-
创建
docker-compose.yml
文件 -
配置文件(这里边的格式,尤其是缩进,由于种种原因可能掺杂
tab
和空格,所以,这里主要关键功能就好)-
version:"3.8" # 指定项目版本(目前最高版本3.8) services: web_build_test: build: context: demo # 指定上下文目录(要打包的Dockerfile所在的目录, 相对目录和绝对目录都行) dockfile: Dockerfile container_name: c_demo ports: - "8083:8083" networks: - hello depends_on: - tomcat01 tomcat01: # 服务名唯一 container_name: tomcat01 image: tomcat:9.0-jre9 # 创建当前这个服务使用的镜像 ports: - 8080:8080 # 宿主机端口:容器端口,最好用引号包起来,<60的端口,在yml中会解析成60进制 volumes: # - /root/apps:/usr/local/tomcat/apps - tomcatdata01:/usr/local/tomcat/apps networks: # 代表当前服务使用哪个网络 - hello depends_on: - redis - mysql tomcat02: container_name: tomcat02 image: tomcat:9.0-jre9 # 创建当前这个服务使用的镜像 ports: - 8081:8080 # 宿主机端口:容器端口,最好用引号包起来,<60的端口,在yml中会解析成60进制 volumes: # - /root/apps:/usr/local/tomcat/apps - tomcatdata02:/usr/local/tomcat/apps networks: # 代表当前服务使用哪个网络 - hello mysql: image: mysql:8.0.23 container_name: mysql port: - "3306:3306" volumes: - mysqldata:/var/lib/mysql - mysqlconfig:/etc/mysql # environment: # - MYSQL_ROOT_PASSWORD=root env_file: - mysql.env networks: - hello healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3 redis: image: redis:6.2.0 container_name: redis ports: - "6379:6379" volume: - redisdata:/data networks: - hello command: "redis-server --appendonly yes" # run镜像之后,覆盖容器内部命令 volumes: # 声明上面服务所使用的的自动创建的卷名 tomcatdata01: # 声明指定的卷名 # compose自动创建该卷名但是会在之前加入项目名称,如 hello_tomcatdata external: # 使用自定义卷名 false # 确定是否使用自定义卷名,如果为true,则需要在服务启动前先手动创建该卷 mysqldata: mysqlconf: redisdata: networks: hello: # 定义上面服务用到的网桥名称,默认创建就是 bridge external: true # 使用外部指定的网桥,网桥必须在服务启动前手动创建
-
mysql.env
MYSQL_ROOT_PASSWORD=root
-
-
-
docker-compose up
(默认前台启动)- 必须保证运行命令所在的目录中存在
docker-compose.yml
文件
- 必须保证运行命令所在的目录中存在
-
-
-
-
version
,compose
版本,- 最高支持的版本可以在这里查到:传送门
-
volumes
,数据卷,等价于run -v
-
networks
,网络,等价于run --network
-
container_name
,给容器指定名字,等价于run --name
-
command
,docker run
启动容器时,运行的一些命令,用来覆盖程序默认启动指令 -
environment
,用于指定容器启动时的环境参数 -
env_file
,环境变量保存的文件路径,用于从文件中获取环境变量- 要求文件必须以
.env
结尾
- 要求文件必须以
-
depends_on
,解决容器的依赖、启动顺序问题- 表示这个服务启动需要依赖于哪些其它服务
- 后边写服务
ID
而不是容器名称 - 该服务不会等到所依赖的服务完全启动后才启动,而是等到所依赖的服务启动到一定程度就启动
-
healthcheck
,用于告诉Docker
引擎应该如何进行判断容器的状态是否正常 -
sysctls
,修改容器中系统内部参数- 非必须,有些服务启动受到容器内操作系统参数限制可能会无法启动,必须通过修改容器中参数才能启动
-
ulimits
,用来修改容器内部系统的最大进程数,使用时可根据当前容器运行服务要求进行修改 -
build
,用来将指定的Dockerfile
打包成镜像,然后再运行该镜像
-
-
-
模板指令,用于书写在
docker-compose.yml
文件中的指令 -
指令,用于对整个
docker-compose.yml
对应的这个项目操作,写在docker-compose
命令之后的命令
-
-
-
-f, --file
,指定使用的compose
模板文件,默认为docker-compose.yml
,可以多次指定 -
-p,--project-name
,指定项目名称,默认将使用所在目录名称作为项目名称 -
--x-networking
,使用Docker
的可插拔网络后端特性 -
--verbose
,输出更多调试信息 -
-v,--version
,打印版本并退出
-
-
Docker-compose
命令-
up
- 它将尝试自动完成包括构建镜像,(重新)创建服务,并关联服务相关容器的一系列操作
- 关联的服务都将会自动启动,除非已处于运行状态
docker-compose up
启动的容器在前台运行,控制台将打印所有容器的输出信息Ctrl+C
停止命令时,所有容器将会停止- 如果使用
docker-compose up -d
,将会在后台启动并运行所有的容器 - 默认下,如果容器已经存在,将会尝试停止容器,然后重新创建(保持使用
volume-from
挂载的卷),以保证新服务以docker-compose.yml
文件的最新内容启动
-
down
- 关闭所有
docker-compose.yml
中的服务,并移除网络(会移除自动创建的网络,不会移除外部网络) - 不会移除数据卷
- 关闭所有
-
exec
-
进入指定的容器
-
类似
docker exec
但有些不同-
例如,
docker
进入23fdd00a692b
容器内并使用shell
,docker exec -it 23fdd00a692b bash
-
docker-compose
要用服务ID
(也就是服务名)进入,docker-compose exec redis bash
-
-
-
ps
- 展示当前
docker-compose
运行的所有容器
- 展示当前
-
restart
- 重启项目中的服务
-
rm
- 删除所有(停止状态的)服务容器。推荐先执行
docker-compose stop
命令来停止容器 -f
,前置直接删除,包括非停止状态的容器服务-v
,删除容器所挂载的数据卷,谨慎使用
- 删除所有(停止状态的)服务容器。推荐先执行
-
start
- 启动已经存在的容器服务
-
stop
- 停止已处于运行状态的容器但不删除它
-t
,停止容器时的超时时间
-
top
- 查看各个服务容器内运行的进程
-
unpause
- 恢复处于暂停状态的服务
-
logs
- 查看服务日志,默认查看所有服务日志
docker-compose logs redis
-
-
docker pull portainer/portainer
-
-
docker run -d \ -p 8000:8000 \ -p 9000:9000 \ --name=portainerWeb \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data portainer/portainer
-
--restart=always
,只要容器关闭则立即重启
-
-
http://你的机器的ip:9000
- 如果是远程主机,需要开放
9000
端口
- 如果是远程主机,需要开放
- 然后设置管理员用户和密码
- 选择
Local
选项进行连接即可