Docker学习(带图详细)

一、安装docker

参考官方文档:https://docs.docker.com/engine/install/centos/

查看系统版本

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@localhost ~]# 
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# 

1.卸载docker旧版本

yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine

2.配置Docker的yum库

首先要安装一个yum工具

yum install -y yum-utils

安装成功后,执行命令,配置Docker的yum源:

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3.安装Docker

最后,执行命令,安装Docker

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

查看安装的版本

docker -v

4.启动和校验

# 启动Docker
systemctl start docker

# 查看Docker的状态
systemctl status docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 关闭开机自启动
systemctl disable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

5.配置镜像加速

这里以阿里云镜像加速为例。

5.1 注册阿里云账号

首先访问阿里云网站:
https://www.aliyun.com/

注册一个账号。

5.2 开通镜像服务

在首页的产品中,找到阿里云的容器镜像服务

点击后进入控制台:

首次可能需要选择立刻开通,然后进入控制台。

5.3 配置镜像加速

找到镜像工具 下的镜像加速器

具体命令

# 创建目录
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

# 查看配置是否生效
docker info|grep Mirrors -A 1

二、了解镜像和容器

1.镜像和容器

DockerHub:https://hub-stage.docker.com/

官方(需要翻墙):https://hub.docker.com/

2.命令解读

以mysql为例:

docker run -d \
  --name mysql \
  -p 3306:3306 \ 
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  mysql

3.镜像命名规范


三、快速入门

1.常见命令

官方文档:https://docs.docker.com/

2.实践案例一

2.1 案例需求

2.2 搜索镜像

https://hub-stage.docker.com/

进入官方的

或者

https://hub.docker.com/u/library

或者命令搜索

#搜索镜像:从网络中查找需要的镜像
docker search 镜像名称

例如:
docker search dvwa

2.3 拉取镜像

docker输入这个命令进行拉取镜像

docker pull nginx

2.4 查看镜像

docker images

2.5 保存镜像到本地

保存镜像到本地

查看帮助
docker save -o --help

保存镜像
docker save -o nginx.tar nginx:latest

2.6 删除镜像

docker rmi 镜像名:版本

例如:
docker rmi nginx:latest

2.7 本地拉取镜像

查看帮助
docker load --help

本地拉取镜像
docker load -i nginx.tar
或者
docker load -i nginx.tar -q

2.8 创建容器

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

-i,以交互模式运行容器,通常与 -t 同时使用
-t,启动容器后,为容器分配一个命令行,通常与-i同时使用
-v,目录映射,容器目录挂载到宿主机目录,格式: <host目录>:<容器目录>
-d,守护进程,后台运行该容器
-p,指定端口映射,格式:主机(宿主)端口:容器端口
-P,随机端口映射,容器内部端口随机映射到主机的端口
-u,以什么用户身份创建容器
--name "nginx-lb",容器名字
-m, --memory bytes,设置容器使用内存最大值
-h, --hostname string,指定容器的 host name
--dns 8.8.8.8,指定容器 dns 服务器
-e username="ritchie",设置环境变量
--restart,Docker 重启后,容器是否自动重启
--privileged,容器内是否使用真正的 root 权限

2.9 查看容器

docker ps :会列出出正在运行的容器信息。
docker ps -a :会列出当前服务器中所有的容器,无论是否在运行。

CONTAINER ID:每个容器的唯一标识符号,自动生成。类似于数据库中的主键。
IMAGE :创建容器使用的镜像名称。
COMMAND:运行容器时的命令。
CREATED:容器创建的时间。
STATUS:容器的运行状态,Up 17 hours 指容器已运行17小时。

docker ps -s:会列出容器的文件大小(容器增加的大小/容器的虚拟大小)


docker ps -q:仅列出CONTAINER ID 字段
如批量停止所有容器:docker stop docker ps -a -q


docker ps -l: 显示最后一个运行的容器(无论该容器目前处于什么状态)
docker ps -n 数量x:显示最后 x 个运行容器,当x为1时和 -l 含义相同。(无论该容器目前处于什么状态)


docker ps --no-trunc:不对输出进行截断操作,此时可以看到完整的COMMAND,CONTAINER ID



docker -f :使用过滤器来过滤输出
目前支持过滤器:
id (容器的id)
label
name(容器名称)
exited (整数-容器退出状态码,只有在使用-all才有用)
status 容器状态(created,restarting,running,paused,exited,dead)
ancestor 过滤从指定镜像创建的容器
before (容器的名称或id),过滤在给定id或名称之后创建的容器
isolation (default process hyperv) (windows daemon only)
volume (数据卷名称或挂载点),--过滤挂载有指定数据卷的容器
network(网络id或名称),过滤连接到指定网络的容器

示例:
docker ps -f status=exited
docker ps -f ancestor=597ce1600cf4 -f status=exited -a



docker ps --formart {{.Names}}:以go的形式格式化输出列表
go模板
.ID 容器的ID
.Image 镜像的ID
.Command 容器启动的命令
.CreatedAt 创建容器的时间点
.RunngingFor 从容器创建到现在过去的时间
.Ports 暴露的端口
.Status 容器的状态
.Size 容器硬盘的大小
.Names 容器的名称
.Label 指定label的值
.Mounts 挂载到这个容器的数据卷名称

示例:
docker ps --formart {{.Names}}---{{.Image}}

docker ps
或者查看所有的容器
docker ps -a

自定义查看容器信息
docker ps --format "table {{.ID}}\t{{.Image}}\{{.Ports}}\t{{.Status}}\t{{.Names}}"


2.10 停止容器

# 停止一个容器
docker stop 容器i或者容器名

# 停止所有容器
docker stop $(docker ps -q)
  • docker ps -q:列出所有运行中容器的ID。
  • docker stop:停止一个或多个运行中的容器。

示例一:

docker stop nginx

示例二:

2.11 启动容器

docker start nginx

2.12 查看日志

docker logs nginx

或者一直查看
docker logs -f nginx

2.13 进入容器

说明:-it参数是可交互的模式    bash是命令行模式
docker exec -it nginx bash

2.14 退出容器

exit

2.15 删除容器

删除所有容器

docker rm $(docker ps -aq)
  • docker ps -aq:列出所有容器(包括未运行的)的ID。
  • docker rm:移除一个或多个容器。

删除单个容器

docker rm 容器id(或者容器名)
或者用-f操作强制删除
docker rm -f 容器id(或者容器名)

示例一:

docker rm nginx

注意:
删除容器的时候,如果不强行删除的话,需要先停止容器
docker stop nginx

示例二:

docker rm $(docker ps -aq)

四、配置Docker国内源

可用源

●Docker 官方中国区:https://registry.docker-cn.com

●网易:http://hub-mirror.c.163.com

●中国科技大学:https://docker.mirrors.ustc.edu.cn

●阿里云:https://y0qd3iq.mirror.aliyuncs.com

1.配置源文件

增加Docker的镜像源配置文件 /etc/docker/daemon.json

如果没有配置过镜像源该文件默认是不存在的

vim /etc/docker/daemon.json

在其中增加如下内容

{
"registry-mirrors": ["https://registry.docker-cn.com"]
}

2.重启docker

service docker restart

3.查看配置是否生效

docker info|grep Mirrors -A 1

五、逻辑卷

1.图解

2.基本命令

查看命令帮助信息
docker volume --help

3.实践案例二

3.1 创建逻辑卷和容器

docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

3.2 查看逻辑卷位置

docker volume ls

查看具体位置
docker volume inspect html

那么以后在宿主机的这个目录下操作文件和在docker容器中操作是一样的效果

3.3 总结

4.实践案例三

mysql官方文档:https://hub-stage.docker.com/_/mysql

4.1 查看容器的详情

docker inspect 容器名(或者是ID)

docker inspect nginx

主要看Mounts的配置信息

"Mounts": [
            {
                "Type": "volume",
                "Name": "html",
                "Source": "/var/lib/docker/volumes/html/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],


4.2 挂载目录

docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql

创建成功后

注意:在运行之前,需要创建这些目录

cd /root

mkdir mysql

cd mysql

mkdir data

mkdir conf

mkdir init

在conf目录下创建配置文件hm.cnf,代码如下

[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

然后在init目录下创建数据信息hmall.cnf

4.3 验证数据持久保存

先删除容器

docker rm -f mysql

无法在连接数据库

但是数据还在宿主机上

再次重新创建容器

docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql

查看连接数据库,发现连接成功,并且数据都还在

六、自定义镜像



1.基础命令

官方文档:https://docs.docker.com/engine/reference/builder

2.构建解读


3.总结

七、网络

1.基本命令

2.创建网络

docker network create 网络名

例如:
docker network create hm

3.查看网络

docker network ls

4.将容器添加到网络

docker network connect 网络名 容器名

例如:
docker network connect hm mysql

5.查看容器信息

docker inspect mysql

八、Docker Compose


1.命令选项

build    ------ 构建(重新构建)项目中的服务容器
config   ------ 检测compose文件的错误
up       ------ 启动服务
down     ------ 停止容器
images   ------ 列出项目中所包含的镜像
logs     ------ 查看服务容器的日志
kill     ------ 发送 SIGKILL 信号来强制停止服务容器
port     ------ 查看某个容器端口所映射的公共端口
ps       ------ 列出项目中目前的所有容器
restart  ------ 重启项目中的服务
rm       ------ 删除所有停止状态的服务容器
run      ------ 在指定服务上运行一个命令
scale    ------ 设置指定服务运行的容器个数
stop     ------ 停止处于运行状态的容器
start    ------ 启动被stop的服务容器
top      ------ 查看各个服务容器内运行的进程
pause    ------ 暂停一个服务容器
unpause  ------ 恢复处于暂停状态中的服务

2.例子

version: "3.8"

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:
      - new
  hmall:
    build:
       context: .
       dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - new
    depends_on:
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/etc/nginx/html"
    depends_on:
      - hmall
    networks:
      - new
networks:
  new:
    name: hmall
相关推荐
热爱嵌入式的小许2 小时前
Linux基础项目开发1:量产工具——显示系统
linux·运维·服务器·韦东山量产工具
雪域迷影5 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
GZ_TOGOGO6 小时前
【2024最新】华为HCIE认证考试流程
大数据·人工智能·网络协议·网络安全·华为
福大大架构师每日一题6 小时前
22.1 k8s不同role级别的服务发现
容器·kubernetes·服务发现
韩楚风6 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
莹雨潇潇6 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
陈苏同学6 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO6 小时前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu77 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我7 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos