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可以帮助开发人员和系统管理员更轻松地部署、运行和管理应用程序。

猜你喜欢

转载自blog.csdn.net/weixin_45549188/article/details/129966834