Docker教程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Docker教程

Docker教程
目录
Docker 教程
一、基础:安装Docker
二、命令

  1. 命令:镜像操作
  2. 命令:容器操作
  3. 命令:run 细节
    4.命令:保存镜像
  4. 命令:分享镜像
    三、存储
  5. 存储:目录挂载
  6. 存储:卷映射
    四、网络
  7. 默认网络是docker0
  8. 网络-自定义网络
  9. 网络-redis主从集群
    五、Docker compose
    六、DockerFile
  10. 基础使用
  11. 镜像分层机制
    Docker 教程
    简单介绍:

image-20240930190525374

一、基础:安装Docker#
用ubuntu 系统来做演示

删除系统里面原有的镜像
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
设置 Docker 的apt存储库。

Add Docker's official GPG key:

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

Add the repository to Apt sources:

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
安装 Docker 包命令
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装完毕,设置开机启动
sudo systemctl enable docker
配置加速镜像

https://www.cnblogs.com/alex-oos/p/18417200

其他系统请参考官方文档:

https://docs.docker.com/engine/install

二、命令#

  1. 命令:镜像操作#
    image-20240930193155629

docker search 检索+,名称,一般可以搜索出来各种版本的镜像,带office 的名称就是官方的镜像,其他的很有可能就是个人的

docker search nginx
image-20240930191801393

docker pull 下载

docker 拉取镜像,镜像名+版本号,默认拉取的是latest版本

docker pull nginx:latest
image-20240930192436708

docker images 查看本地镜像列表

docker images
image-20240930192712982

docker rmi 删除镜像

删除的时候,可以使用唯一id,也可以使用镜像名,如果镜像被占用就删除不了

docker rmi nginx
image-20240930192752612

  1. 命令:容器操作#
    image-20240930193239892

运行docker run

docker run + 镜像名

docker run -d --name=mynginx nginx
image-20240930194156684

docker ps 查看此刻所有运行的容器
docker ps

查看所有容器

docker ps -a

过滤中你想要的容器名称

docker ps -a | grep '容器名'
image-20240930194334625

docekr stop 停止 +容器名/容器id
docker stop mynginx
docker stop 95c7e10581f3
image-20240930194525624

docker start 启动 +容器名/容器id
docker start mynginx
docker start 95c7e10581f3

docker restart 重启 +容器名/容器id
docker restart mynginx
docker restart 95c7e10581f3
docker stats 状态+容器名/容器id

查看cpu,内容,占用率

docker stats mynginx
docker stats 95c7e10581f3
image-20240930194815752

docker logs 日志 ++容器名/容器id
docker logs mynginx
image-20240930194937610

docker exec 进入容器

-it 交互式进入

/bin/bash 用bash的启动指令

docker exec -it +容器名称/容器id /bin/bash

docker exec -it mynginx /bin/bash
docekr rm 删除 +容器名/容器id

注意:如果容器处于运行状态无法删除,先停止容器运行,在进行删除操作,强制-f 不推荐使用,仅仅知道即可

docker rm mynginx
docker rm 95c7e10581f3

强制

docker rm -f mynginx

  1. 命令:run 细节#
    docker run +镜像名

-d 后台运行
docekr run -d nginx
--name +容器名 +镜像名
docker run --name=mynginx nginx:latest
-p 端口映射 本机端口:容器端口
docker run -p 80:80 --name=mynginx nginx:latest
4.命令:保存镜像#
image-20240930200825714

docker commit 提交容器,将容器提交一下
docker commit -m '注释' 容器名
docker save 将镜像保存为一个文件

docker save -o +文件名 + 镜像

docker save -o 'mynginx.tar' nginx
docker load 将文件加载为一个镜像

docker 加载文件

docker load -i mynginx.tar

  1. 命令:分享镜像#
    image-20240930201112946

docekr hub 地址:https://hub.docker.com/

介绍:docker hub 其实主要是用于存储docekr镜像的地方,类似于github,首先需要注册一下,然后将对应的镜像给push上去

docker login 登录 输入你的账号与密码,即将登录成功

docker login
docker tag 设置标签

docker tag [OPTIONS] IMAGE [NAME[:TAG]]
IMAGE:要打标签的镜像的 ID 或名称。
[NAME[:TAG]]:新的标签名称,其中 NAME 是仓库的名称,TAG 是标签。
demo:

一般做的时候,做一个指定版本,在做一个最新版本的,这样子方便别人拉取到最新版本的

设置标签

docker tag mynginx:v1 alexoos/nginx:v1

设置完查看一下镜像

docker images
docker tag mynginx:v1 alexoos/nginx:latest
docker push 推送 + 镜像名称

docker push alexoos/nginx:latest
三、存储#
docker ps -aq 打印所有的容器id

打印所有容器的id

docker ps -aq

批量删除所有未运行的容器

docker rm $(docker ps -aq)

  1. 存储:目录挂载#
    命令: -v 目录挂载 本地目录:容器目录

目录挂载主要是以外面的文件夹为准,如果目录挂载时外面的文件夹,没有文件,那么里面的也没有文件

如果本地目录不存在,会自动进行创建目录

docker run -d -p 81:80 -v /app/nghtml:/usr/share/nginx/html --name app01 nginx
目录挂载的作用:

容器内将内容修改后,会自动同步到本地目录,一劳永逸的方式

将数据持久化,不担心数据会丢失,容器丢失,数据仍然存在

  1. 存储:卷映射#
    -v 卷映射 -v ngconf:/etc/nginx

卷映射:是以容器内部的文件夹为准,第一次启动,内部有数据,将内部的数据映射到外部

应用范围:

用于配置挂载
用于本地不存在,但是容器启动又必须读取的配置

-v 卷名:容器目录

-v ngconf:/etc/nginx

启动容器,使用目录挂载,卷映射,如果卷不存在,就自动创建

docker run -d -p 99:80 -v /app/nghtml:/usr/share/nginx/html -v ngconf:/etc/nginx --name app02 nginx

卷目录的默认路径

/var/lib/docker/volumes/

列出所有的卷

docker volume ls

查看某个卷的详细信息

docker volume inspect ngconf (卷名)
四、网络#
介绍:

分为默认网络与自定义网络

  1. 默认网络是docker0#
    查看默认网络:ip a ,找到docker0 发现 inet 为 172.17.0.1/16 ,这个一般都是默认网络

image-20241010152227138

docker 一般每启动一个容器,默认会给容器一个ip地址,直接访问容器内的数据,可以使用容器ip+容器端口互相访问

查看容器的ip的相关命令

启动一个容器

docker run -d -p 8011:80 --name app01 nginx

docker inspect + 容器名,直接看network,network 下面有相关的ip地址,一般是172.17.0.1 这个网段

docker inspect app01
image-20241010152113231

  1. 网络-自定义网络#
    自定义网络:其实就是为了方便A容器与B容器直接访问,因为ip 容易发生改变,所以自定义开辟一个网络,这样子用容器名+端口互相访问,更加高效与便捷

自定义网络相关命令 先输入--help 方便查看如何使用

docker network --help
docker network create mynet
自定义网络的网段一般是:172.22.0.1

启动容器的时候,加入 --network 参数即可

启动的容器就加入了自定义网络了

docker run -d -p 88:80 --name app01 --network mynet nginx
docker run -d -p 88:80 --name app02 --network mynet nginx

访问的时候,直接用容器名+端口即可

设置完毕之后,两个容器内相互访问直接用 curl http://app01:80 直接就访问成功了,只有在容器内相互访问才可以,在容器外访问不行

如果想设置都可以访问,建议使用自定义网络,设置自定义网段 +固定ip地址,这样子才可以,参考项目为:

https://gitee.com/alex-oos/kinit/blob/master/docker-compose.yml 这个设置的相对标准一些

  1. 网络-redis主从集群#
    先不补充,后期补充,

五、Docker compose#
介绍:

批量管理容器的工具

首先需要准备一个docker-compose.yml 文件

常用的命令如下:

上线 (启动并且创建所有容器)

docker-compose up -d

重启所有容器

docker-compose restart

停止所有容器 下线

docker-compose down

查看所有容器状态

docker-compose ps -a

启动单个容器

docker-compose start x1 x2 x3

停止多个容器

docker-compose stop x1 x2 x3

扩容容器 扩容 x 2=3 代表 x2容器启动3个

docker compose scale x2=3
举例 :需要安装 wordpress

正常安装步骤

创建网络 blog

docker network create blog
创建容器mysql

docker run --name wordpress-db -e MYSQL_ROOT_PASSWORD=yourpassword -e MYSQL_DATABASE=wordpress --network wordpress-net -d mysql:8.0
创建容器 wordpress

docker run --name wordpress -e WORDPRESS_DB_PASSWORD=yourpassword -e WORDPRESS_DB_HOST=wordpress-db:3306 -p 80:80 --network wordpress-net -d wordpress
使用 docker-compose,一个文件即可

创建一个docker-compse.yml 文件,文件如下

name: myblog
services:
mysql:

# 容器名 
container_name: mysql
# 镜像
image: mysql:8.0
# 端口
ports:
  - "3306:3306"
# 环境变量
environment:
  - MYSQL_ROOT_PASSWORD=123456
  - MYSQL_DATABASE=wordpress
# 挂载卷
volumes:
  # 卷映射
  - mysql-data:/var/lib/mysql
  # 目录挂载
  - /app/mysql/conf.d:/etc/mysql/conf.d
# 自动重启
restart: always
# 网络
networks:
  blog_network:
    ipv4_address: "177.8.0.2"

wordpress:
container_name: wordpress
image: wordpress:latest
ports:

  - "9011:80"
environment:
  WORDPRESS_DB_HOST: mysql
  WORDPRESS_DB_NAME: wordpress
  WORDPRESS_DB_USER: root
  WORDPRESS_DB_PASSWORD: 123456
volumes:
  - wordpress:/var/www/html
restart: always
networks:
  blog_network:
    ipv4_address: "177.8.0.3"
depends_on:
  - mysql

持久化存储卷

volumes:
mysql-data:
wordpress:

networks:
blog_network:
driver: bridge
ipam:
driver: default
config:

    - subnet: "177.8.0.0/16"
      gateway: "177.8.0.1"

进入到文件下,执行下面命令

docker-compse up -d
六、DockerFile#

  1. 基础使用#
    常用命令:

image-20241010181706036

文件内需要包含

基础环境
软件包
启动命令
比如:启动一个java 服务,建议将基础环境与代码软件分开,这里是写的所有,比较全,其实也可以直接用网上的镜像也是可以的

创建一个文件Dockerfile

[kod.new-youths.com)
[kod.papadcj.com)
[kod.xp1489.com)
[kod.roycues.com)
[kod.rockiesenglish.com)
[kod.cvdds.com)
[kod.itdsm.com)
[kod.xjxqd.com)

从某一个基础镜像创建

FROM Ubuntu:20.04

添加标签,可以设置用户名

Label author="Alex"

指定工作目录

WORKDIR /home/work
COPY . /home/work

安装基础环境,jdk,mavn ,git

RUN apt-get update && apt-get install -y openjdk-11-jdk && apt-get install -y maven && apt-get install -y git

构建指定参数

ARG env

运行自定义命令

RUN cd /home/work && mvn -B clean install -P${env} -Dmaven.test.skip=true -Dautoconfig.skip -pl semi-automatic-migration-server -am && cp -r semi-automatic-migration-server/target target

暴露端口

EXPOSE 8080

容器固定启动命令

ENTRYPOINT ["/bin/bash"]

容器启动命令或参数 (拼接在 ENTRYPOINT 后面)

CMD java -Dfile.encoding=utf-8 -jar target/semi-automatic-migration-server.jar

docker 构建命令如下:

docker build --build-arg env=环境 -t 镜像名 . (点是当前目录的意思)

docker build --build-arg env=test -t demo1 .
docker build 参数

--build -arg 参数构建传递

-t 镜像名

--file +文件名 指定文件,如果不在当前目录下,或文件名不为Dockerfile 就需要这个参数

  1. 镜像分层机制#
    ​ 基础环境做第一层,代码做第二层,一般都是这样子使用即可

image-20241010184544175

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
关系型数据库 MySQL Java
Docker Compose详细教程(从入门到放弃)
Docker Compose详细教程(从入门到放弃)
966 0
|
9天前
|
Linux Docker 容器
Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!
本篇博客重在讲解Centos安装docker,经博主多次在不同服务器上测试,极其的稳定,尤其是阿里的服务器,一路复制命令畅通无阻。
82 4
Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!
|
6天前
|
定位技术 文件存储 网络架构
Docker部署PhotoPrism、Immich图片管理应用,无需公网IP远程访问教程
除了Synology、QNAP、TerraMaster等品牌的NAS设备内置图库功能,市面上还有多种备受欢迎的第三方应用,如PhotoPrism、Immich、LibrePhotos、Piwigo、Photoview等。这些应用不仅提供强大的图片管理能力,还可通过Docker轻松部署。借助贝锐花生壳服务,即使没有公网IP也能实现远程访问,突破地理限制,提升数据可访问性和安全性,让用户随时随地管理私人图库。
33 1
|
8天前
|
Linux 开发工具 Docker
各个类linux服务器安装docker教程
各个类linux服务器安装docker教程
31 0
|
1月前
|
Cloud Native 持续交付 Docker
云原生技术实践:Docker容器化部署教程
【9月更文挑战第4天】本文将引导你了解如何利用Docker这一云原生技术的核心工具,实现应用的容器化部署。文章不仅提供了详细的步骤和代码示例,还深入探讨了云原生技术背后的哲学,帮助你理解为何容器化在现代软件开发中变得如此重要,并指导你如何在实际操作中运用这些知识。
|
2月前
|
网络协议 Unix Shell
Docker基本教程
这篇文章是关于Docker的入门教程,介绍了Docker的基本命令和操作,包括镜像搜索、拉取、列出、删除,容器的运行、进入、退出、查看状态、停止、重启和删除,以及权限问题的解决方法。
70 2
|
2月前
|
Linux 测试技术 Docker
Docker CE for CentOS 安装教程
Docker CE for CentOS 安装教程
108 1
|
2月前
|
Ubuntu Shell Linux
docker快速入门教程
docker快速入门教程
69 0
|
3月前
|
关系型数据库 MySQL Linux
Docker安装mysql详细教程, mysqld: Can‘t read dir of ‘/etc/mysql/conf.d/‘(报错已解决)
Docker安装mysql详细教程, mysqld: Can't read dir of '/etc/mysql/conf.d/' (Errcode: 2 - No such file or directory) 已解决