目录
一、前言
在之前的云原生篇对 Docker 有做讲解,由于不太详细,所以单独出了一篇作为讲解,并且为之后的操作都是在docker里面进行操作。
二、结构
1、镜像名称
镜名称一般分两部分组成:[repository]:[tag]。
在没有指定tag时,默认是latest,代表最新版本的镜像
2、镜像命令的流程
三、Docker常用命令
总结Docker常用命令,便于梳理和巩固对Docker的学习,也便于能够研究Docker更深层面的技术实现。
1、与仓库相关
$ docker search $KEY_WORD # 查找镜像
$ docker pull $REGISTRY:$TAG # 获取镜像
$ docker push $IMAGE_NAME:$IMAGE_TAG # 推送镜像到仓库,需要先登录
$ docker login $REGISTRY_URL # 登录仓库
$ docker logout $REGISTRY_URL # 退出仓库
$ docker info # 显示Docker详细的系统信息,可查看仓库地址
$ docker --help # 显示Docker的帮助信息
2、与容器相关
$ docker attach $CONTAINER_ID # 启动一个已存在的docker容器
$ docker stop $CONTAINER_ID # 停止docker容器
$ docker start $CONTAINER_ID # 启动docker容器
$ docker restart $CONTAINER_ID # 重启docker容器
$ docker kill $CONTAINER_ID # 强制关闭docker容器
$ docker pause $CONTAINER_ID # 暂停容器
$ docker unpause $CONTAINER_ID # 恢复暂停的容器
$ docker rename $CONTAINER_ID # 重新命名docker容器
$ docker rm $CONTAINER_ID # 删除容器
$ docker logs $CONTAINER_ID # 查看docker容器运行日志,确保正常运行
$ docker inspect $CONTAINER_ID # 查看container的容器属性,比如ip等等
$ docker port $CONTAINER_ID # 查看container的端口映射
$ docker top $CONTAINER_ID # 查看容器中正在运行的进程
$ docker commit $CONTAINER_ID $NEW_IMAGE_NAME:$NEW_IMAGE_TAG # 将容器保存为镜像
$ docker ps -a # 查看所有容器
$ docker stats # 查看容器的资源使用情况
3、与镜像相关
$ docker images # 查看本地镜像
$ docker rmi $IMAGE_ID # 删除本地镜像
$ docker rm -f xxx # 强行删除本地镜像
$ docker inspect $IMAGE_ID # 查看镜像详情
$ docker save $IMAGE_ID > 文件路径 # 保存镜像为离线文件
$ docker save -o 文件路径 $IMAGE_ID # 保存镜像为离线文件
$ docker load < 文件路径 # 加载文件为docker镜像
$ docker load -i 文件路径 # 加载文件为docker镜像
$ docker tag $IMAGE_ID $NEW_IMAGE_NAME:$NEW_IMAGE_TAG # 修改镜像TAG
$ docker run 参数 $IMAGE_ID $CMD # 运行一个镜像
$ docker history $IMAGE_ID # 显示镜像每层的变更内容
4、与run命令相关
# -d,后台运行容器, 并返回容器ID;不指定时, 启动后开始打印日志, Ctrl+C退出命令同时会关闭容器
# -i,以交互模式运行容器, 通常与-t同时使用
# -t,为容器重新分配一个伪输入终端, 通常与-i同时使用
# --name container_name,设置容器名称, 不指定时随机生成
# -h container_hostname,设置容器的主机名, 默认随机生成
# --dns 8.8.8.8,指定容器使用的DNS服务器, 默认和宿主机一致
# -e docker_host=172.17.0.1,设置环境变量
# --cpuset="0-2" or --cpuset="0,1,2",绑定容器到指定CPU运行
# -m 100M,设置容器使用内存最大值
# --net bridge,指定容器的网络连接类型, 支持bridge/host/none/container四种类型
# --ip 172.18.0.13,为容器指定固定IP(需要使用自定义网络none)
# --expose 8081 --expose 8082,开放一个端口或一组端口,会覆盖镜像设置中开放的端口
# -p [宿主机端口]:[容器内端口],宿主机到容器的端口映射,可指定宿主机的要监听的IP,默认为0.0.0.0
# -P,注意是大写的, 宿主机随机指定一组可用的端口映射容器expose的所有端口
# -v [宿主机目录路径]:[容器内目录路径],挂载宿主机的指定目录(或文件)到容器内的指定目录(或文件)
# --add-host [主机名]:[IP],为容器hosts文件追加host, 默认会在hosts文件最后追加[主机名]:[容器IP]
# --volumes-from [其他容器名],将其他容器的数据卷添加到此容器
# --link [其他容器名]:[在该容器中的别名],添加链接到另一个容器,在本容器hosts文件中加入关联容器的记录,效果类似于--add-host
eg:创建并运行一个容器
创建并运行nginx容器的命令:
docker run --name containerName -p 80:80 -d nginx
命令解读:
四、隔离环境
1、说明
进入容器。进入我们刚刚创建的nginx容器的命令为:
docker exec -it mn bash
命令解读:
容器内没有vi命令,无法直接修改,我们用下面的命令来修改:
sed -i -e 's#Welcome to nginx#xxxxx#g' -e 's#<head>#<head><meta charset="utf-8">#g' index.html
2、数据卷(容器数据管理)
3、什么是数据卷
数据卷操作的基本语法如下:
docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
4、创建和查看数据卷
需求:创建一个数据卷,并查看数据卷在宿主机的目录位置
1) 创建数据卷
docker volume create html
2)查看所有数据
docker volume ls
3)查看数据卷详细信息卷
docker volume inspect html
可以看到,我们创建的html这个数据卷关联的宿主机目录为/var/lib/docker/volumes/html/_data
目录。
4)、小结
5、挂在数据卷
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:
docker run \
--name mn \
-v html:/root/html \
-p 8080:80
nginx \
这里的-v就是挂载数据卷的命令:
-v html:/root/htm
:把html数据卷挂载到容器内的/root/html这个目录中
eg:挂载 mysql
docker run \
--name mysql2 \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25
挂载sentinel
docker run \
--name sentinel1 \
-d \
-p 8858:8858 \
-d \
bladex/sentinel-dashboard
docker run -dit sentinel1 /bin/bash
挂载nacos
docker run \
--name mynacos \
-e MODE=standalone \
-p 8848:8848 \
-d \
nacos/nacos-server
6、小结
docker run的命令中通过 -v 参数挂载文件或目录到容器中:
五、自定义镜像
常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。
而要自定义镜像,就必须先了解镜像的结构才行。
1、镜像结构
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。
我们以MySQL为例,来看看镜像的组成结构:
2、Dockerfile语法
3、Docker-Compose
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。格式如下:
version: "3.8"
services:
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "/tmp/mysql/data:/var/lib/mysql"
- "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
web:
build: .
ports:
- "8090:8090"
部署示例 docker-compose文件
version: "3.2"
services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"
可以看到,其中包含5个service服务:
六、搭建私有镜像仓库
Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
搭建方式比较简单,命令如下:
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。
访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像
1、带有图形化界面版本
使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=xxxxx
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
2、配置Docker信任地址
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.71.132:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
3、推送、拉取镜像
推送镜像到私有镜像服务必须先tag,步骤如下:
1)重新tag本地镜像,名称前缀为私有仓库的地址:192.168.150.101:8080/
docker tag nginx:latest 192.168.150.101:8080/nginx:1.0
2)推送镜像
docker push 192.168.150.101:8080/nginx:1.0
3)拉取镜像
docker pull 192.168.150.101:8080/nginx:1.0