Docker快速入门,学习工作利器。
目录
前言
Docker是一种容器技术,使用 Google 公司推出的 Go
语言 进行开发实现,基于 Linux 内核
的 cgroup,namespace,以及 OverlayFS 类的 Union FS(分层
) 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
优点:
1、一致的运行环境,更轻松的迁移,解决了-在开发的时候,在本机测试环境可以跑,生产环境跑不起来
2、对进程进行封装隔离,容器与容器之间互不影响,更高效的利用系统资源,解决了-服务器程序相互影响,如A程序正常运行,B程序出现问题导致大量消耗内存,导致A服务宕机
3、通过镜像复制多个环境一致的容器,解决了-需要部署多个相同服务的场景,避免了重新搭建环境等
4、安装软件方便,解决了-如ElasticSearch,Redis、nacos等软件的安装,一条命令运行安装,没有系统兼容问题,支持下载多版本等优点
一、安装与配置镜像加速
1.1 安装
桌面版:https://www.docker.com/products/docker-desktop
服务器版:https://docs.docker.com/engine/install/#server
示例
:centos7.x安装docker
-
卸载原始docker
$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
安装docker依赖
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
-
设置docker的yum源
$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
-
安装最新版的docker
$ sudo yum install docker-ce docker-ce-cli containerd.io
-
指定版本安装docker
$ yum list docker-ce --showduplicates | sort -r $ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io $ sudo yum install docker-ce-18.09.5-3.el7 docker-ce-cli-18.09.5-3.el7 containerd.io
-
启动docker
$ sudo systemctl enable docker $ sudo systemctl start docker
-
关闭docker
$ sudo systemctl stop docker
-
测试docker安装
$ sudo docker run hello-world
1.2 配置镜像加速
镜像加速源
镜像加速器 | 镜像加速器地址 |
---|---|
Docker 中国官方镜像 | https://registry.docker-cn.com |
DaoCloud 镜像站 | http://f1361db2.m.daocloud.io |
Azure 中国镜像 | https://dockerhub.azk8s.cn |
科大镜像站 | https://docker.mirrors.ustc.edu.cn |
阿里云 | https://ud6340vz.mirror.aliyuncs.com |
七牛云 | https://reg-mirror.qiniu.com |
网易云 | https://hub-mirror.c.163.com |
腾讯云 | https://mirror.ccs.tencentyun.com |
1.2.1 Docker桌面版配置镜像加速源
"registry-mirrors": ["https://registry.docker-cn.com"]
1.2.2 Docker服务器版配置镜像加速源
1、创建文件夹
sudo mkdir -p /etc/docker
2、创建文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
3、重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
1.2.3 查看配置是否生效
docker info
1.2.4 其他Docker镜像站
如果还是很慢,了解下DaoCloud的镜像站
https://www.daocloud.io/mirror#accelerator-doc
二、介绍下一些概念
1、镜像(Image)
:Docker 镜像是一个只读的模板,其中包含了一个应用程序运行所需的所有文件和依赖项。它可以通过 Dockerfile 来创建或者从 Docker Hub 等镜像仓库中获取。
2、容器(Container)
:Docker 容器是从 Docker 镜像创建的可运行实例。它包含应用程序和其依赖项,并且可以在任何地方运行。容器是轻量级的,因为它们与宿主机共享操作系统内核。
3、仓库(Repository)
:Docker 仓库是用于存储 Docker 镜像的地方。它可以是公共的,例如 Docker Hub,也可以是私有的,例如搭建在本地的 Docker 仓库。
4、Dockerfile
:Dockerfile 是一个文本文件,其中包含了一系列用于构建 Docker 镜像的指令。通过 Dockerfile,可以定义应用程序运行时的环境、依赖项、配置等信息。
5、挂载点(Volume)
:Docker 挂载点是一个可在容器和宿主机之间共享的目录。它可以用于在容器中保存数据、配置文件等,以便在容器重新启动时保持数据的持久性。
6、网络(Network)
:Docker 网络是用于连接 Docker 容器的虚拟网络。它可以使容器之间相互通信,也可以连接容器与宿主机或其他网络。
7、Compose
:Docker Compose 是一个工具,可以通过一个简单的 YAML 文件定义和运行多个 Docker 容器。它可以使容器的管理和部署变得更加简单和自动化。
2.1 常用命令
2.1.1 辅助命令
# 1.安装完成辅助命令
docker version -------------------------- 查看docker的信息
docker info -------------------------- 查看更详细的信息
docker --help -------------------------- 帮助命令
2.1.2 Images 镜像命令
# 1.查看本机中所有镜像
docker images -------------------------- 列出本地所有镜像
-a 列出所有镜像(包含中间映像层)
-q 只显示镜像id
# 2.搜索镜像
docker search [options] 镜像名 --------------- 去dockerhub上查询当前镜像
-s 指定值 列出收藏数不少于指定值的镜像
--no-trunc 显示完整的镜像信息
# 3.从仓库下载镜像
docker pull 镜像名[:TAG|@DIGEST] ----------------- 下载镜像
# 4.删除镜像
docker rmi 镜像名/hash -------------------------- 删除镜像
-f 强制删除
docker rmi $(docker images) -------------------- 删除全部镜像
2.1.3 Contrainer 容器命令
# 1.运行容器
docker run 镜像名 -------------------------- 镜像名新建并启动容器
--name 别名为容器起一个名字
-d 启动守护式容器(在后台启动容器)
-p 映射端口号:原始端口号 指定端口号启动
例:
docker run -it --name myTomcat -p 8888:8080 tomcat
docker run -d --name myTomcat -P tomcat
# 2.查看运行的容器
docker ps ---------------------- 列出所有正在运行的容器
-a 正在运行的和历史运行过的容器
-q 静默模式,只显示容器编号
# 3.停止|关闭|重启容器
docker start 容器名字或者容器id --------------- 开启容器
docker restart 容器名或者容器id --------------- 重启容器
docker stop 容器名或者容器id ------------------ 正常停止容器运行
docker kill 容器名或者容器id ------------------ 立即停止容器运行
# 4.删除容器
docker rm -f 容器id和容器名
docker rm -f $(docker ps -aq) ---------------------- 删除所有容器
# 5.查看容器内进程
docker top 容器id或者容器名 ------------------ 查看容器内的进程
# 6.查看查看容器内部细节
docker inspect 容器id ------------------ 查看容器内部细节
例:docker inspect my-redis
# 7.查看容器的运行日志
docker logs [OPTIONS] 容器id或容器名 ------------------ 查看容器日志
-t 加入时间戳
-f 跟随最新的日志打印
--tail 数字 显示最后多少条
例:docker logs my-redis
# 8.进入容器内部
docker exec [options] 容器id 容器内命令 ------------------ 进入容器执行命令
-i 以交互模式运行容器,通常与-t一起使用
-t 分配一个伪终端 shell窗口 bash
例:docker exec -it my-redis bash
# 9.容器和宿主机之间复制文件
docker cp 文件|目录 容器id:容器路径 ------------- 将宿主机复制到容器内部
docker cp 容器id:容器内资源路径 宿主机目录路径 ------- 将容器内资源拷贝到主机上
# 10.数据卷(volum)实现与宿主机共享目录
docker run -v 宿主机的路径|任意别名:/容器内的路径 镜像名
注意:
1.如果是宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容
2.如果是别名则会在docker运行容器时自动在宿主机中创建一个目录,
并将容器目录文件复制到宿主机中
# 11.打包镜像
docker save 镜像名 -o 名称.tar
# 12.载入镜像
docker load -i 名称.tar
# 13.容器打包成新的镜像
docker commit -m "描述信息" -a "作者信息" (容器id或者名称) 打包的镜像名称:标签
基本上常用的命令就这些,剩下的比较进阶的就是 挂载(Volume)和网络(Network)在下面的案例中会用到。
挂载(Volume)
: 解决容器内的数据和宿主机共享,类似虚拟机的共享文件夹。
网络(Network)
: 解决了容器间互相通信问题,如在微服务架构中服务之间需要相互通信,例如,订单服务(order-service)可能需要调用用户服务(user-service)来获取用户信息。在 Docker 网络中,订单服务可以使用 user-service 的容器名称来访问用户服务。例如:http://user-service/api/users/{id}
三、如何安装软件?
Docker 官方镜像仓库:https://hub.docker.com/
示例
- 更多安装案例,在此专栏下。
-
拉取运行mysql:8.0.32
1、拉取mysql:8.0.32 docker pull mysql:8.0.32 2、运行mysql服务 docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3366:3306 -d mysql:8.0.32 `参数解释: --name mysql -为容器取名为mysql -e MYSQL_ROOT_PASSWORD=123456 -初始化mysql的密码为123456 -p 3306:3306 -宿主机端口:容器端口 mysql默认3306端口映射到宿主机上的3366端口 -d 后台运行 `
3、此时可以使用数据库管理工具如navicat连接3366端口
4、既然是容器化,如果我把容器删除了,那我mysql的数据去哪了?
答
:没错,也删除了。但我们可以通过数据卷挂载,把容器中的数据挂载到宿主机中。5、
进阶
数据卷挂载,找到mysql数据存放的位置将容器数据位置与宿主机位置挂载保证数据安全 docker run --name mysql -v /root/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=root -p 3366:3306 -d mysql:8.0.32
四、Dockerfile构建镜像
Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件。
- 通过架构图可以看出通过DockerFile可以直接构建镜像
Dockerfile解析过程
4.1 Dockerfile的保留命令
官方说明:https://docs.docker.com/engine/reference/builder/
保留字 | 作用 |
---|---|
FROM | 当前镜像是基于哪个镜像的 第一个指令必须是FROM |
MAINTAINER | 镜像维护者的姓名和邮箱地址 |
RUN | 构建镜像时需要运行的指令 |
EXPOSE | 当前容器对外暴露出的端口号 |
WORKDIR | 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点 |
ENV | 用来在构建镜像过程中设置环境变量 |
ADD | 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包 |
COPY | 类似于ADD,拷贝文件和目录到镜像中 将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置 |
VOLUME | 容器数据卷,用于数据保存和持久化工作 |
CMD | 指定一个容器启动时要运行的命令 Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换 |
ENTRYPOINT | 指定一个容器启动时要运行的命令 ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数 |
例子
:仓库地址https://gitcode.net/chendi/springboot_elasticsearch_demo
4.2 Dockerfile示例
# 基于jdk8构建
FROM openjdk:8-jdk-alpine
ARG APP_VERSION=1.0.0
ENV APP_HOME /app
# 设置工作目录
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
# 拷贝文件和目录到镜像中
COPY elasticsearch-demo-0.0.1-SNAPSHOT.jar $APP_HOME/es-demo.jar
# 暴露容器端口
EXPOSE 8899
# 启动时要运行的命令
CMD ["java","-Xmx512m","-Xms512m", "-jar", "es-demo.jar"]
构建镜像
docker build -t em-demo:1.0.0 .
# 默认版本号为最新-latest
docker build -t em-demo .
`参数解释:
-t 设置镜像名字和版本号
`
运行镜像
docker run -p 8899:8899 es-demo
五、Docker Compose 容器的快速编排
在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的mysql容器,甚至还包括nginx容器等。
Compose
项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
下面我们来看看具体怎么使用:
5.1 安装与卸载
Compose项目开源地址: https://github.com/docker/compose
- 在 Linux 上安装从官方GitHub Release 处直接下载编译好的二进制文件即可。例如,在 Linux 64 位系统上直接下载对应的二进制包。目前已更新到V2版本是用go重写的。
docker官网安装compose地址:
https://docs.docker.com/compose/install/linux/#install-using-the-repository
对于基于 RPM 的发行版如:CentOS ,请运行:
sudo yum update
sudo yum install docker-compose-plugin
通过检查版本来验证是否正确安装了 Docker Compose。
docker compose version
5.2 docker-compose 示例
编写 docker-compose.yml 常用参数
参数 | 描述 |
---|---|
version | 定义 Compose 文件的版本号。 |
services | 定义服务列表,每个服务都对应一个容器。 |
image | 容器的镜像名称。 |
build | 构建镜像所需的 Dockerfile 路径。 |
volumes | 将本地文件夹挂载到容器中。 |
ports | 将容器的端口映射到主机上的端口。 |
environment | 设置环境变量。 |
command | 容器启动的命令。 |
depends_on | 定义服务之间的依赖关系。 |
restart | 容器的重启策略。 |
networks | 定义容器所在的网络。 |
示例:别把docker compose想的太复杂,就是docker run镜像时的命令换种写法拼凑在一起。
docker-compose.yml
version: '3'
services:
# 配置服务容器
es_demo:
# 容器名为es_demo
container_name: es_demo
# 依赖openjdk:8-jdk-alpine镜像
image: openjdk:8-jdk-alpine
# 挂载指定jar包位置
volumes:
- /opt/project/es/elasticsearch-demo-0.0.1-SNAPSHOT.jar:/es_demo.jar
ports:
- "8899:8899"
environment:
- TZ="Asia/Shanghai"
- SPRING_PROFILES_ACTIVE=prod
command: ["java","-Xmx512m","-Xms512m", "-jar", "/es_demo.jar"]
depends_on:
- elasticsearch
- mysql
=========================Dockerfile构建 start===========================
es_demo:
# 容器名为es_demo
container_name: es_demo
# Dockerfile构建
build: .
ports:
- "8899:8899"
depends_on:
- elasticsearch
- mysql
=========================Dockerfile构建 end===========================
mysql:
container_name: mysql
image: mysql:8.0.32
environment:
MYSQL_DATABASE: test-db
MYSQL_ROOT_PASSWORD: 12345678
MYSQL_ROOT_HOST: '%'
volumes:
- ~/dockerData/mysql/conf:/etc/mysql/conf.d
- ~/dockerData/mysql/logs:/logs
- ~/dockerData/mysql/data:/var/lib/mysql
ports:
- "3306:3306"
restart: always
redis:
container_name: redis
image: redis:latest
ports:
- "6379:6379"
restart: always
elasticsearch:
container_name: elasticsearch
image: elasticsearch:7.14.0
networks:
- es-net
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
volumes:
- ~/dockerData/es/data:/usr/share/elasticsearch/data
kibana:
container_name: kibana
image: kibana:7.14.0
networks:
- es-net
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- 5601:5601
depends_on:
- elasticsearch
rabbitmq:
container_name: rabbitmq
image: rabbitmq:3.8-management
ports:
- "5672:5672"
- "15672:15672"
environment:
- RABBITMQ_DEFAULT_VHOST=myvhost
- RABBITMQ_DEFAULT_USER=myuser
- RABBITMQ_DEFAULT_PASS=mypassword
restart: always
networks:
es-net:
# 在同级目录 运行
docker-compose up
访问:ip:端口// 就能访问到服务了。
如127.0.0.1:8899
如果这步,某些服务报错如:es,可能是文件夹的权限不够
去到对应文件运行命令:chmod 777
chmod 777 文件夹名/文件名
Docker Compose 常用命令
命令 | 描述 |
---|---|
docker-compose up | 启动容器。 |
docker-compose down | 停止并删除容器。 |
docker-compose pull | 拉取最新的镜像。 |
docker-compose build | 构建服务。 |
docker-compose ps | 列出当前正在运行的服务。 |
docker-compose logs | 查看服务的日志。 |
docker-compose restart | 重启服务。 |
docker-compose stop | 停止服务。 |
docker-compose start | 启动服务。 |
docker-compose exec | 在运行的容器中运行命令。 |
总结
以上就差不多是开发常用的Docker操作了,无论是学习安装软件到开发部署服务,Docker可以帮助开发人员和系统管理员更轻松地部署、运行和管理应用程序。