Docker 镜像都是只读的,当容器启动时,一个新的可写层被加到镜像的顶部。
这一层就是我们通常说的容器层,容器层之下的都叫镜像层。
联合文件系统(UnionFS)是 Docker 的核心,也是 Docker 得以极致精简的保证。分层下载
分层镜像的好处,与之前的版本共用一部分,不用再重复下载
基础命令
docker version #查看docker的版本信息
docker info #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令(可查看可选的参数)
docker COMMAND --help
镜像命令
docker images 查看本地主机的所有镜像
docker search 搜索镜像
docker pull 镜像名[:tag] 下载镜像 指定版本下载
docker rmi 删除镜像
容器命令
docker run [可选参数] image
#参数说明
–name=“名字” 指定容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
(
-p ip:主机端口:容器端口 配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口
)
-P 随机指定端口(大写的P)
exit 停止并退出容器(后台方式运行则仅退出)
Ctrl+P+Q 不停止容器退出
docker ps 列出运行过的容器命令
# 列出当前正在运行的容器 -a
# 列出所有容器的运行记录 -n=?
# 显示最近创建的n个容器 -q
# 只显示容器的编号
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
日志的查看
docker logs --help
查看容器中进程信息
docker top
查看容器的元数据
docker inspect 容器id
进入当前正在运行的容器
docker exec -it c703b5b1911f /bin/bash
docker attach c703b5b1911f
拷贝操作
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
提交镜像
使用docker commit 命令提交容器成为一个新的版本
docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名:[TAG]
先下载镜像 docker pull mysql-server、zabbix-java-gateway、zabbix-server-mysql、zabbix-web-nginx-mysql
启动MySQL实例
docker run --name mysql-server -t
-e MYSQL_DATABASE=“zabbixdb”
-e MYSQL_USER=“zabbix”
-e MYSQL_PASSWORD=“zabbix_paw”
-e MYSQL_ROOT_PASSWORD=“root_user”
-p 3307:3306
-d mysql:8.0
–character-set-server=utf8 --collation-server=utf8_bin
–default-authentication-plugin=mysql_native_password
启动Zabbix Java gateway实例
docker run --name zabbix-java-gateways -t
-d zabbix/zabbix-java-gateway
启动Zabbix server实例
docker run --name zabbix-server-mysqls -t
-e DB_SERVER_HOST=“36.139.53.254”
-e DB_SERVER_PORT=“3307”
-e MYSQL_DATABASE=“zabbixdb”
-e MYSQL_USER=“zabbix”
-e MYSQL_PASSWORD=“zabbix_paw”
-e MYSQL_ROOT_PASSWORD=“root_user”
-e ZBX_JAVAGATEWAY=“zabbix-java-gateways”
-p 10051:10051
-d zabbix/zabbix-server-mysql
启动Zabbix Web界面
docker run --name zabbix-web-nginx-mysqls -t
-e ZBX_SERVER_HOST=“36.139.53.254”
-e DB_SERVER_HOST=“36.139.53.254”
-e DB_SERVER_PORT=“3307”
-e MYSQL_DATABASE=“zabbixdb”
-e MYSQL_USER=“zabbix”
-e MYSQL_PASSWORD=“zabbix_paw”
-e MYSQL_ROOT_PASSWORD=“root_user”
-p 80:8080
-d zabbix/zabbix-web-nginx-mysql
地址: ip:80
默认的用户名 Admin 以及密码 zabbix,即可登录
Nginx部署
(1)搜索并下载镜像
docker search nginx
docker pull nginx
docker images
docker run -d --name nginx01 -p 3334:80 nginx
- bootfs(boot file system):启动文件系统。
- rootfs:root file system:基础文件系统。
docker commit [参数] 容器 [仓库[:标签]]
docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名:[tag]
- :作者信息。一般为 作者名字<邮箱>。
- :将 Dockerfile 指令应用于创建的映像。
- :注释信息。
- :提交期间暂停容器(默认)。
下载Tomcat镜像到本地
docker pull tomcat:9.0
docker images
启动容器
docker run -it --name tomcat123 -p 8888:8080 tomcat:9.0
docker exec -it tomcat123 /bin/bash
对Tomcat镜像进行修改
cp -r webapps.dist/* webapps
ls -l webapps
提交镜像
# 退出Tomcat容器
exit
# 执行docker commit 提交生成新的tomcat镜像
docker commit -m=“add webapps App” -a=“sunwukong” d60ed0bff852 tomcat123:1.0
启动自定义的Tomcat镜像
docker run -it -p 8888:8080 tomcat123:1.0
目录的挂载,将我们容器内的目录,同步到linux上面,容器间也是可以数据共享的
方式一:直接使用命令来挂载 -v
以交互模式启动 centos 镜像
docker run -it -v /home/ceshi:/home centos /bin/bash
Mounts 下的 Source 即为设置的主机目录、Destination 即为设置的容器目录
数据卷技术实现的是双向同步
- (readonly):只读。
- (readwrite):可读可写。
实战
具名和匿名挂载
具名挂载
由于指定了卷名,所以这种方式称为具名挂载由于指定了卷名,所以这种方式称为具名挂载
启动镜像时只定义主机卷名称,不指定挂载目录。
docker run -it -v my-centos:/home centos /bin/bash
查看目前挂载的卷
docker volume ls
查看卷的详情
[root@sail mysql]# docker volume inspect my-centos
[
{
“CreatedAt”: “2021-12-20T16:55:35+08:00”,
“Driver”: “local”,
“Labels”: null,
“Mountpoint”: “/var/lib/docker/volumes/my-centos/_data”,
“Name”: “my-centos”,
“Options”: null,
“Scope”: “local”
}
]
卷挂载在 目录下
匿名挂载
启动镜像时只指定容器目录
docker run -it -v /home centos /bin/bash
查看目前挂载的卷
docker volume ls
查看卷的详情
docker volume inspect
- 每个指令都必须是大写字母。
- 按照从上到下顺序执行。
- # 表示注释。
- 每一条指令都会创建一个新的镜像层。
docker build
Dockerfile 编写好后,需要使用 命令运行
docker build -f 路径 -t name:tag
- :指定要使用的Dockerfile路径。
- :镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
- :设置内存最大值。
docker history查看构建记录
编写 Dockerfile
构建镜像
查看构建的镜像
查看本地镜像的构建记录
运行测试
编写 Dockerfile
其中的 readme.txt 一般作为镜像说明文件,可以在里面编写镜像的信息。
构建镜像
启动镜像
启动时将 tomcat 的 webapps 和 logs 目录都挂载到了本机
查看挂载目录
[root@sail tomcat]# ls /home/sail/tomcat
logs webapps
进入容器
jdk 和 readme.txt 都是具备了的,且 tomcat 目录下的文件也是完整的
查看挂载文件
这里以 logs 为例,我们先进入 tomcat 容器中的 logs 文件夹查看日志内容
然后再退出查看主机上挂载的 logs 文件夹
两个地方 logs 下的文件内容一致,说明挂载成功
注册账号
登录 Docker Hub 账号
发布镜像
docker push
docker tag
必须以 的格式命令才能提交
此时会多出一个相同 ID 但是标签和名字不同的镜像
再次发布镜像
这样就能发布成功了。且可以发现,镜像的发布也是分层发布的。
由于对国外网络的限制,发布镜像到 DockerHub 是比较缓慢的。
这里可以使用配置 Docker 国内镜像站的方式实现加速。
运行以下命令即可:
该脚本可以将 加入到 Docker 配置文件 中
适用于 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1,其他版本可能有细微不同
去 Docker Hub 上以 账号名/镜像名 搜索我们刚发布的镜像,发现是可以搜索到的
登录阿里云,点击我的阿里云
创建实例
进入镜像仓库
创建好个人实例后,点击进入。
创建命名空间
一个账号只能创建 3 个命名空间,需要谨慎创建。
创建镜像仓库
点击下一步,创建本地仓库
退出登录的账号
登录阿里云账号
有三个网卡信息:
- lo:本地。
- ens:虚拟机或阿里云服务器地址。
- docker0:Docker 网络地址。
在 Docker 安装后,主机会为 Docker 分配一个网卡,名为 docker0
该网卡使用桥接模式,使用的是 veth-pair 技术
启动两个容器
查看 Linux 网络
Docker 每启动一个容器,就会分配一个 IP
查看容器的内部网络
可以看到容器内 IP 与本机 IP 成对出现,这就是 veth-pair 技术
容器访问 docker0 测试
容器与 docker0 之间是可以访问的
容器与容器之间访问
Docker 中的所有网络接口都是虚拟的,相当于内网传递。
只要删除容器,对应网络就会删除。
docker run —link
每次重启容器或 Linux,IP 就会变化,固定 IP 互联网络就会失效。
如果能使用服务名来连接,而不考虑 IP,就会方便很多。
测试使用容器名来 ping
容器之间无法通过容器名来连接
先启动 tomcat01
使用 命令启动 tomcat02
在 tomcat02 访问 tomcat01
在 tomcat01 访问 tomcat02 则无法访问
tomcat02 能够通过容器名访问 tomcat01,原理是 通过 tomcat02 在自己容器 hosts 文件中配置了 tomcat01 IP 信息
这种方式已经不流行了,建议使用自定义网络实现。
docker network ls
- bridge:桥接模式(默认)。自己创建也使用这种模式。
- host:和宿主即共享。
- none:不配置网络。
启动容器
在我们启动容器的时候默认会有一个网络设置
自定义网络,先使用 命令查询一下
docker network create
参数
- :网络模式
- :子网
- :网关
创建自定义网络
查看创建的网络
以下配置可以看出,自定义网络创建完成
启动镜像
连接测试
这种方式可以实现不同集群使用不同的网络,保证集群网络的安全。
如 Redis 集群在 192.160.0.0/16 网段下,MySQL 集群在 192.161.0.0/16 网段下
docker network connect
使用实现一个容器链接到另一个网段。
建立连接
查看容器详情
这里也可以发现容器 tomcat02-net 已经与 mynet 建立了连接
测试连接
网络连通成功
使用 Docker 的时候,定义 Dockerfile 文件,然后使用 、 等命令操作容器。
然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,这样效率很低,也不方便管理。
使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。
yaml 官方示例
https://docs.docker.com/compose/compose-file/compose-file-v3/#compose-file-structure-and-examples
depends_on:依赖关系,如 web 依赖 redis 和 db,通过 depends_on 表明关系。
Docker Compose 是 Docker 的一个开源项目,目前托管到了 GitHub,需要前往 GitHub 下载。
由于存放在 GitHub,国内网络限制导致不太稳定,不推荐使用。
推荐使用 道客 提供的 Docker 极速下载 进行安装。
安装
授权
docker-compose version
由于 Linux 一切皆文件,删除此文件夹即可完成 Docker Compose 的卸载。
创建项目目录
创建 app.py
redis 是应用容器中 redis 容器的主机名,在同一网络下可以通过服务名访问,端口默认 6379。
创建 requirements.txt
创建 Dockerfile
创建 docker-compose.yml
docker-compose up
运行应用
第一次启动需要安装很多环境,比较缓慢。
查看镜像
启动 Docker Compose 时,会自动拉取需要的镜像。
查看容器
可以看到容器命名都带有数字,是因为需要集群管理,数字代表副本序号。
查看网络
项目中的内容都在同个网络下。
访问测试
Docker Compose 启动完成。
docker-compose stop
示例
docker-compose down
示例