Docker Client
- 拉取镜像
- docker pull redis
- 运行
- docker run redis
- 构建
- docker build
- 推送
- docker push
容器
容器其实就是一个独立的应用,以及一整套他自己必须的环境所形成的,他可以实现应用的隔离,提高了应用的高可用以及安全。
他跟虚拟化相比他拥有更为轻量的部署环境,可以实现操作系统内核共享
Docker 安装
1:移除系统中存在的旧的版本的 dockersudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2:配置 docker 下载地址源
# 安装 yum-utils 工具
sudo yum install -y yum-utils
# 配置下载源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 yum-utils 工具
sudo yum install -y yum-utils
# 配置下载源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce.repo
3:安装 docker 引擎
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
4:启动 docker
sudo systemctl start docker
Docker 的简单命令
docker 镜像的操作
- 搜索一个镜像
- docker search nginx
- 下载
- docker pull nginx
- 所有的镜像查询
- docker images
- docker image ls
- 删除
- docker rmi nginx:latest
docker 的镜像的启动
- 运行
- docker run --name -d -p -v -e
- –name 容器的名字
- -d 后台启动
- -p 端口映射,例如内部的 80 和外部的 88 端口映射:88:80
- -v 数据映射
- -e 容器内部的一些参数
- docker run --name -d -p -v -e
- 查看
- docker ps [-a] [-p]
- -a 所有的容器
- -p 只显示 conatiner id
- docker ps [-a] [-p]
- 停止
- docker stop
- 启动
- docker start
- 重启
- docker restart
- 状态
- docker stats
- 日志
- docker logs
- 进入
- docker exec -it image-name /bin/bash
- 删除
- docker rm
- -f 强制删除
- docker rm
这里面最为重要的为 docker run
的操作,这里展开讲解一下 run 的相关命令
docker run -name my-nginx -p 80:80 -d nginx:stable-alpine3.19-perl
docker 把当前运行的 imginx 发布到 docker hub
中间会用到的命令为
- docker commit 可以把一个正在运行的容器打包为一个镜像
- -a 作者
- -m 提交信息
- docker save 可以把一个本地的 docker 的镜像打包为一个 tar 文件
- -o 制作一个 tar 文件的名字
- docker load
- -i archive 的名字和路径
docker commit
# commit a contain -> image
docker commit -a xl-9527 -m 'update index.html' mynginx mynginx:v1
docker save
docker save -o mynginx.tar mynginx:v1
这里就会把镜像打包为一个 mynginx.tar 的压缩包文件到当前的文件夹中,然后可以把这个文件交付给使用的人直接使用 docker load -i 当前的 tar 文件 直接把这个 tar 加载为一个 image,然后通过 docker run 命令来运行倒入的 image
docker load
docker load -i tar文件的完整路径
docker 推送本地 image 到 docker hub
- docker login
- docker tag
- docker push
在要把一个 image 推送到 docker hub 的时候,是需要登录 docker 的首先要注册。然后在本地登录
docker login
这个命令可以直接登录 docker。
2:登录成功以后就是要把 image 的镜像的命名规范化。首先我们要知道 docker 的命名规范是什么
2.1:用户名/image-name:version 这就是命名规范,如果不符合要求要改一下,修改的命令为 docker tag
docker tag mynginx:v1 xl-9527/mynginx:v1
这样就把之前的 mynginx 修改为 xl-9527/mynginx:v1,接下来就可以把这个本地的 image 推送到远程的 docker hub
3:使用命令 docker push xl-9527/mynginx:v1
这样就可以推送到 docker hub,然后可以在 docker 官网看到自己的镜像
docker 创建数据卷
这样可以创建一个数据卷:docker volume create 数据卷的名字
数据卷创建以后他的默认位置为:/var/lib/docker/volumes/数据卷的名字/_data
,如果在 -v 的时候不带斜杠就好默认当作数据卷来创建一个数据卷,如果指定来一个反斜杠就会表面这是一个文件的路径,不会创建数据卷
数据卷和目录映射的区别是什么呢?
数据卷
容器刚刚启动的时候会把容器内部默认的映射文件同步到数据卷中。如果数据卷为空的话,然后启动成功以后就会实现数据的同步
目录映射
会直接把主机的目录信息同步到容器内部覆盖容器内部的所有文件,这样会存在一个很严重的问题。如果第一次启动本地不存在文件或者文件夹。那么容器内部的映射的目录的文件信息也会被覆盖置为空。
# 创建数据卷
docker volume create mynginx_volume
# 启动 nginx
docker run -p 80:80 -v mynginx_volume:/var/share/nginx/html -d --name mynginx01 nginx:latest
# 查看自己创建的容器的描述信息 这样就可以看到所有的信息关于这个镜像的
docker container inspect mynginx01
docker 网络
试着想一个这样的需求。如果存在一个需求,我们需要在容器内部访问另一个容器的提供的信息。我们该如何来访问呢?
是否是通过宿主机的IP和暴露的宿主机的映射端口来访问。如果是这样不就是网卡 -> 宿主机 -> 容器。这样的效率很低下。所以是否可以直接通过容器的名字来访问对应的信息呢?
这里可以使用创建 docker network 来实现容器的互相访问。我们通过 docker container inpect 容器id 来查看所有的容器的信息,这里也可以看到网络相关的信息。如果我们在 docker run 的时候不指定对应的网络设置。就会创建到默认的 network 里面 -> docker0 网卡。所以不支持通过容器 name 来互相交互。所以在这里需要创建一个自己的 network
docker network 创建
docker network create 网络名字
docker 以及存在的网络查询
# 查询以及存在的 network for docker
docker network ls
docker network 绑定到 docker run
# 创建 container nginx01
docker run --network 刚刚创建到网络名字 -d -p 80:80 --name mynginx01 nginx:latest
# 创建 container nginx01
docker run --network 刚刚创建到网络名字 -d -p 88:80 --name mynginx02 nginx:latest
# 进入 nginx01 并且访问 nginx01
docker exec -it nginx01 /bin/bash
# 访问 nginx02
curl nginx02
这里就可以看到了我们创建两个 nginx,然后进入到 nginx02 容器然后 curl 访问 nginx01 来获取首页信息。
docker compose
要是使用 docker compose 需要先创建一个 yaml -> dompose.yaml 这样可以批量创建 container 例如创建 mysq,nginx,kafka,zookeeper等。
启动一个 compose.yaml docker compose up -d
这个命令可以在后台启动一个 compose
- docker compose up -d
- 启动 compose
- docker compose down
- 关闭一个 compose
- docker compose start container_name1,container_name2 (yaml中配置的容器的名字)
- docker compose stop container_name1,container_name2 (yaml中配置的容器的名字)
- 停止这些 compose名字的运行
- docker compose scale
- 扩容 container 的实例个数
name: myblog
services:
mysql:
container_name: mymysql
image: mysql:8.0
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: workpress
volumes:
- mysql-data:/var/lib/mysql
- /xing/myconf:/etc/mysql/conf.d
restart: always
networks:
- blog
wordpress:
image: workpress
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: workpress
WORDPRESS_DB_PASSWORD: 123456
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress:/var/wwww/html
restart: always
networks:
- blog
depends_on:
- mysql
volumes:
mysql-data:
wordpress:
netwoks:
blog:
docker compose 在编写的时候需要注意一些事情。
1:数据卷和网络必须在要顶级标签定义然后再在 service 中使用
2:如果不指定容器名字默认会用应用的名字来做前缀
3:environment 的指定可以使用 数组的方式,也可以使用 map 的形式,虽然支持两种形式,但是不支持在即存在 map,又存在 array 的数据结构。
docker compose up -d
可以直接启动 yaml 配置文件。
docker compose down
如果只用默认的 down 命令就只会删除容器和网络,只有指定一些参数的时候才会把那些 volumes 对应的卷信息也删除,-v 命令
docker-compose -f docker-compose.yaml -v down
可以把这个 yaml 中的 image 和对应的 volumes 对应的也删除。
DockerFIle
DockerFile 支持自定义的镜像文件。比如可以把本地的一个 jar 包封装到一个 image 中可以通过 image 启动然后运行在 docker 容器中。
指令信息
FROM | 指定镜像基础环境 |
---|---|
RUN | 运行自定义命令 |
CMD | 容器启动命令或者参数 |
LABEL | 自定义标签 |
EXPOSE | 指定暴露端口 |
ENV | 环境变量 |
ADD | 添加文件到镜像 |
COPY | 复制文件到镜像 |
ENTRYPOINT | 容器固定启动命令 |
VOLUME | 数据卷 |
USER | 指定用户和用户组 |
WORKDIR | 指定默认工作目录 |
ARG | 指定构建参数 |
编写 DockerFile 文件
# 指定运行在什么环境下,这里可以设置为 ubuntu 系统,然后通过
FORM openjdk:17
# 标签
LABEL author=xl-8527
# 暴露端口
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "/arr.jar"]
把上面的 DockerFile 构建一个镜像到本地,
docker build -f DockerFile -i my-java-app:v1 .
运行以后就会出现一个镜像在 docker 镜像列表中,可以直接使用 docker run 来运行这个构建好的镜像,他的名字会使用 -i 参数对应的值