Linux安装Docker,以及Docker的常用命令。docker的自定义镜像,最终使用推荐docker compose一件部署
一、Docker 定义
- 快速构建、运行、管理应用的工具
二、Linux安装Docker
1、首先要清除旧版Docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-selinux
2、centos7配置源问题解决
-
将
mirrorlist
注释,开启baseurl
-
由于
centos7
在24年六月停更新版本了,所以把baseurl
里的mirror
改成vault
vi /etc/yum.repos.d/CentOS-Base.repo #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra baseurl=http://vault.centos.org/centos/$releasever/centosplus/$basearch
3、配置Docker的yum库
-
首先要安装一个yum工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
-
配置Docker的yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
-
更新yum,建立缓存
sudo yum makecache fast
4、安装Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
5、docker启动和校验
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
# 查看版本号
docker -v
# 列出所有本地镜像
docker images
6、配置镜像加速(免费的)
-
首先访问阿里云网站:https://www.aliyun.com/,(可能不生效,换网上其他可用源)
-
开通镜像服务:在首页的产品中,找到阿里云的容器镜像服务,点击后进入控制台
-
配置镜像加速:找到镜像工具下的镜像加速器,页面向下滚动,即可找到配置的文档说明。
# 创建目录 mkdir -p /etc/docker # 复制内容,注意把其中的镜像加速地址改成你自己的 tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] } EOF # 重新加载配置 systemctl daemon-reload # 重启Docker systemctl restart docker
三、常用部署
1、部署原理
- 当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。
2、部署MySQL
docker run -d \ #docker run 安装并运行 -d容器在后台运行
--name mysql \ #给容器起名字,名字必须唯一
-p 3306:3306 \ #主机端口:容器端口端口映射,每个容器都是隔离的状态,内部有自己的所有配置,甚至有端口号,所以需要将内部端口映射到安装主机的端口。
-e TZ=Asia/Shanghai \ #-e key=value 设置环境变量
-e MYSQL_ROOT_PASSWORD=123 \
mysql #运行的镜像的名字,命名规范:镜像名称:版本号,版本号不写默认最新。
四、docker基础
-
补充说明1:容器开机自启
# Docker容器开机自启 容器名或者容器id,任选其一 docker update --restart=always [容器名/容器id]
-
补充说明2:长命令可以起别名
# 修改/root/.bashrc文件 vi /root/.bashrc alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"' alias dis='docker images' # 执行命令使别名生效 source /root/.bashrc
1、常见命令
命令 | 说明 |
---|---|
docker pull | 从镜像仓库 拉取容器镜像 到本地仓库 |
docker push | 从本地仓库 推送容器镜像 到镜像仓库 |
docker images | 查看本地镜像仓库存储的容器镜像 |
docker rmi | 删除镜像 |
docker run | 安装并运行容器 |
docker stop | 停止容器 |
docker start | 启动容器 |
docke restart | 重启容器 |
docker rm | 删除容器 |
docker ps | 查看docker运行的容器 |
docker logs | 查看容器日志 |
docker exec | 进入容器 |
docker save | 打包镜像 |
docke load | 加载镜像 |
docker inspect | 查看容器配置信息 |
- 图像理解:
2、数据卷操作命令
命令 | 说明 |
---|---|
docker volume create | 创建数据卷 |
docker volume ls | 查看数据卷 |
docker volume rm | 删除指定数据卷 |
docker volume inspect | 查看指定数据卷的信息 |
docker volume prune | 删除所有状态 为不在使用 的数据卷 |
3、挂载
- 作用:完成挂载,可以将主机上的一个文件目录和容器里的某个目录
双向绑定
,可以方便操作文件。
3.1、数据卷挂载
-
数据卷挂载
是在容器创建时进行操作,用 -v数据卷名
:挂载容器目录地址
。# 1.首先创建容器并指定数据卷,注意通过 -v 参数来指定数据卷 docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
3.2、本地目录挂载
-
本地目录挂载
是在容器创建时进行操作,用 -v本地目录
:挂载容器目录地址
。 -
本地目录
一定要"/"
或者"./"
开头,否则会被识别成数据卷挂载
# 1.进入root目录 cd ~ # 2.创建并运行新mysql容器,挂载本地目录 docker run -d \ --name mysql \ -p 3306:3306 \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=123 \ -v ./mysql/data:/var/lib/mysql \ -v ./mysql/conf:/etc/mysql/conf.d \ -v ./mysql/init:/docker-entrypoint-initdb.d \ mysql
五、自定义镜像
- 定义:镜像分为
入口
、层
和基础镜像
。 - 入口:镜像运行入口,一般是程序启动的脚本和参数,java -jar xx.jar
- 层:添加安装包、依赖、配置等,每次操作都形成新的一层。
- 基础镜像:应用依赖的系统函数库、环境、配置、文件等。
1、Dockerfile文件
- 定义:Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。
指令 | 说明 |
---|---|
FROM | 指定基础镜像 |
ENV | 设置环境变量,可在后面指令使用 |
COPY | 拷贝本地文件到镜像的指定目录 |
RUN | 执行Linux的shell命令,一般是安装过程的命令 |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 |
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \ && tar -xf ./jdk8.tar.gz \ && mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]
2、上传jar包,快捷使用方式
-
Dockerfile文件指定一个基础镜像,只需要上传jar包,编写入口即可。
# 基础镜像 FROM openjdk:11.0-jre-buster # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["java", "-jar", "/app.jar"]
-
构建镜像
docker build
docker build -t myImage:1.0 . #-t 给镜像起名称 镜像名:版本号 不写版本号默认latest #“.” 点是Dockerfile所在目录,当前目录就是“.”
六、网络容器互联
1、可以解决以下问题
- 容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。
自定义的网络
可以实现访问容器名
就可以访问到对应地址,不需要指定网络,只有自定义网络才可以通过容器名互相访问
。- 在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
- 在同一个自定义网络中的容器,可以通过别名互相访问
2、常见命令
命令 | 说明 |
---|---|
docker network create | 创建一个自定义网络 |
docker network ls | 查看所有网络 |
docker network rm | 删除某个网络 |
docker network prune | 删除所有网络 |
docker network connect | 指定某一个容器连接到网络 |
docker network disconnect | 指定某一个容器离开网络 |
docker network inspect | 查看网络详细信息 |
示例:
# 1.首先通过命令创建一个网络
docker network create hmall
# 2.然后查看网络
docker network ls
# 结果:
NETWORK ID NAME DRIVER SCOPE
639bc44d0a87 bridge bridge local
403f16ec62a2 hmall bridge local
0dc0f72a0fbb host host local
cd8d3e8df47b none null local
# 其中,除了hmall以外,其它都是默认的网络
# 3.让dd和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
# 这样该网络内的其它容器可以用别名互相访问!
# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
docker network connect hmall mysql --alias db
# 3.2.db容器,也就是我们的java项目
docker network connect hmall dd
# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it dd bash
# 4.2.用db别名访问
ping db
# 结果
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms
# 4.3.用容器名访问
ping mysql
# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms
docker run -d --name nginx \-p 18080:18080 \
-p 18081:18081 \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network heima \
nginx
七、docker Compoes
1、doker-compose.yaml文件
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- hm-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- hmall
networks:
- hm-net
networks:
hm-net:
name: hmall
- version:docker Compoes版本号
- services:容器组件
- mysql:容器名称
- image:镜像
- container_name:容器别名
- ports:端口映射
- environment:环境变量参数
- TZ:数据库时区
- MYSQL_ROOT_PASSWORD:数据库密码
- volumes:文件夹或者配置文件挂载
- networks:添加到哪个自定义网络字段下
- build:自定义镜像
- context:docker文件以及上传资源所在目录
- dockerfile:dockerfile文件名
- depends_on:容器依赖,就是要给谁发送请求的容器
- networks:自定义网络
- hm-net:自定义网络名称
- name:网络别名
- hm-net:自定义网络名称
2、运行命令
类型 | 参数或指令 | 说明 |
---|---|---|
Options | -f | 指定compose文件的路径和名称 (如果在当前包下可以省略) |
-p | 指定project名称。project就是 当前compose文件中设置的多个service的集合,是逻辑概念 | |
Commands | up | 创建并启动所有service容器 |
down | 停止并移除所有容器、网络 | |
ps | 列出所有启动的容器 | |
logs | 查看指定容器的日志 | |
stop | 停止容器 | |
start | 启动容器 | |
restart | 重启容器 | |
top | 查看运行的进程 | |
exec | 在指定的运行中容器中执行命令 |
# 5.启动所有, -d 参数是后台启动
docker compose up -d
此文章是根据黑马程序员spring cloud课程所学,这是根据我自己的理解,提炼出的笔记。文章没有过多的解释,命令是可以直接执行的。Linux版本为centos7最小安装包CentOS-7-x86_64-Minimal-2009.iso,视频出处哔哩哔哩黑马程序员Spring Cloud