初始教程:
参考教程b站视频:
https://www.bilibili.com/video/BV11L411g7U1?p=2
课件地址:
https://docker.easydoc.net

深入教程:
参考教程b站视频:
https://www.bilibili.com/video/BV1og4y1q7M4?p=3&spm_id_from=pageDriver

Docker认识

官网:https://www.docker.com/
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/

Windows安装

桌面版安装地址:
https://www.docker.com/products/docker-desktop

替换源地址:
https://registry.docker-cn.com

添加: “registry-mirrors”:[“https://registry.docker-cn.com”,“https://docker.mirrors.ustc.edu.cn”],

可以在/etc/docker/daemon.json中配置,也可以在docker.service中修改,效果一样。
在这里插入图片描述

修改镜像路径到d盘:
参考文档:https://blog.csdn.net/u013948858/article/details/111464534
默认存储路径:
在这里插入图片描述

wsl --export docker-desktop-data "D:\\docker-desktop-data.tar"
wsl --unregister docker-desktop-data
wsl --import docker-desktop-data "D:\\docker\\wsl" "D:\\docker-desktop-data.tar" --version 2

在这里插入图片描述

注意1:
双击打开显示,docker desktop stopped:
解决方法: C:\Users<username>\AppData\Roaming\Docker\settings.json, and set “wslEngineEnabled”: true

注意2:
默认安装是在C盘,比较占用空间。
在安装之前,创建到D盘里:
管理员运行cmd命令:

mklink /j "C:\Program Files\Docker" "D:\Program Files\Docker"

阿里云镜像配置

在这里插入图片描述

Docker 安装软件redis

Docker 官方镜像仓库查找 Redis :https://hub.docker.com/

本地命令行输入:

docker run -d -p 6379:6379 --name redis redis:latest

在这里插入图片描述
安装结束之后,在docker desktop里面就可以看到redis:
在这里插入图片描述
点击进去可以看到,当前redis的log日志、inspect版本和端口、stats占用内存等。
在这里插入图片描述
进入redis的终端:
在这里插入图片描述

docker命令参考:https://docs.docker.com/engine/reference/commandline/run/

Docker安装wordpress

在这里插入图片描述
拷贝到文件:docker-compose.yml
powershell运行安装:

docker-compose up -d

在这里插入图片描述
安装结束后,docker窗口查看
在这里插入图片描述
浏览器查看:
在这里插入图片描述

Docker的常用命令

帮助命令

docker version    # 显示docker的版本信息
docker info       #  显示docker的系统信息,包括镜像和容器的数量
docker --help     #  帮助命令

在这里插入图片描述

帮助文档地址:https://docs.docker.com/engine/reference/commandline

镜像命令

docker images 查看所有本地的主机上的镜像

在这里插入图片描述
解释:
REPOSITORY 镜像的仓库源
TAG 镜像标签
IMAGE ID 镜像id
CREATED 镜像的创建时间
SIZE 镜像的大小

 docker images --help

在这里插入图片描述
可选项:
-a, --all 列出所有的镜像
-q, --quiet 只显示镜像ID

docker search 搜索镜像

在这里插入图片描述

docker search --help

可选项:
通过收藏来过滤
–filter=STARS=100 # 搜索出来的镜像 收藏数量大于100
在这里插入图片描述

docker pull 下载镜像

docker pull 镜像名称 [:tag]

docker pull mysql      # 不指定版本 下载最新的
docker pull mysql:5.7  # 指定版本下载 官网要有的

在这里插入图片描述

docker rmi 删除镜像

在这里插入图片描述

官网地址:https://docs.docker.com/engine/reference/commandline/images/

容器命令

有了镜像才可以新建容器,下载一个centos镜像来学习
在这里插入图片描述

新建容器并启动
docker run -it centos /bin/bash
映射外路径启动docker run -v D:\A_Project\docker\centos:/home --name centos  -it centos

在这里插入图片描述
在这里插入图片描述

列出所有运行的容器
 docker ps -a  # 查看当前所有容器
 docker ps     # 查看正在运行的容器
 docker ps -a -n=1  # 列出最新创建的容器 n为个数

在这里插入图片描述

退出容器
exit                # 直接退出容器
ctrl +P+Q      # 容器不停止退出
删除容器
docker rm 容器id                # 删除指定id的容器
docker rm -f $(docker ps -aq)  # 删除所有的容器
启动和停止容器的操作
docker start 容器id       # 启动容器
docker restart  容器id    # 重启容器
docker stop 容器id        # 停止当前正在运行的容器
docker kill 容器id        # 强制停止当前容器

其他常用命令

查看日志
# docker logs -f -t --tail 最后条数 容器ID
docker logs -f -t --tail 100 5bf2312ac02f  # 显示最后100条日志
docker logs -tf  # 显示全部日志
查看容器进程信息ps
# docker top 容器ID
PS C:\Users\taohy> docker top 5bf2312ac02f
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                1667                1646                0   
查看镜像的元数据

docker inspect 容器ID
在这里插入图片描述

在这里插入图片描述

进入当前正在运行的容器
# 我们的容器通常是使用后台运行的方式,需要进入容器,修改一些配置。
# 命令
docker exec -it 容器ID /bin/bash

在这里插入图片描述

在进入容器之后,输入命令:

apt-get update

# 安装vim命令
apt-get install vim

# 安装ifconfig命令
apt-get install net-tools

# 安装ping命令
apt-get install iputils-ping
从容器内拷贝文件到主机上
# 命令 docker cp 容器ID:容器内路径 目的的主机路径
PS C:\Users\taohy> docker cp 53359cb5303a:/home/test.py d:/

# 上面实现的是将 容器内部的/home/test.py 拷贝到主机D盘

# 拷贝是一个手动过程,未来我们使用-v卷的技术

小结

在这里插入图片描述

作业

部署Nginx

1. 搜索镜像  # 建议官网docker hub搜索
2. 下载镜像  # pull

# -d 后台运行
# --name 给容器命名
# -p 主机端口:容器内部端口
4. 启动镜像  
docker run -d --name nginx01 -p 1314:80 nginx
5. 运行测试
curl http://localhost:1314
6. 进入容器
docker exec -it 42661a9e38d9 /bin/bash
7. 查看路径
whereis nginx

思考问题:我们每次改动nginx配置见,都需要进入容器内部?十分麻烦,如何在主机修改文件,容器内部就直接修改?-v 数据卷!

搜索镜像:在这里插入图片描述
启动镜像:
在这里插入图片描述
运行测试:
在这里插入图片描述

部署Tomcat

# docker 运行
docker run -it --rm -p 1314:8080 tomcat:9.0
# 访问网址 阉割版
http://localhost:1314/
# 进入容器,拷贝文件到webapps
 cp -r webapps.dist/* webapps
 # 访问网址
 http://localhost:1314/

访问网址,阉割版:
在这里插入图片描述

在这里插入图片描述

commit 镜像

docker commit 提交容器成为一个新的版本

# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

docker commit -m="add webapps" -a="taohy" 3c070f4da805 tomcat_taohy:1.0

实战测试

# 1. 启动一个默认的tomcat
# 2. 发现这个默认的tomcat是没有webapps应用,官方镜像默认webapps下面是没有文件的!
# 3. 我自己拷贝进去了基本的文件
# 4. 将我们操作过的容器通过commit提交为一个镜像!我们以后就使用我们改过的镜像即可,这就是我们自己的一个修改镜像。

用docker images命令查看新增的镜像:
在这里插入图片描述

Docker数据卷

卷技术,实际就是将容器内的目录,挂在到主机上。
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的。

使用数据卷

方式一:命令行 -v
docker run -it -v 主机目录:容器目录

实战:安装Mysql

思考:mysql的数据持久化问题

# 搜索
docker search mysql
# 拉取
docker pull mysql:5.7
# 查看镜像
docker images
# 启动 运行容器 需要挂在容器 配置密码
# 官网 $ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

-d 后台运行
-p 端口映射
-v 卷挂载 多个对应多个-v
-e 环境配置
--name 容器名字
docker run -d -p 33061:3306 -v D:\docker\mnt\mysql\conf:/etc/conf.d -v D:\docker\mnt\mysql\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

主机工具测试mysql连接:
在这里插入图片描述

在这里插入图片描述
主机文件映射位置:
在这里插入图片描述
容器内部文件和外机映射文件比对:(任何一端编辑之后,都会同步进行)
在这里插入图片描述
假设我们将容器删除,发现,我们挂在到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。

具名和匿名挂载

匿名挂载:
-v 容器内路径 不指定容器外路径
在这里插入图片描述

具名挂载:
在这里插入图片描述
如何区分匿名挂载和具名挂载:

-v 容器内路径         # 匿名挂载
-v 卷名:容器内路径     # 具名挂载
-v /主机路径:容器内路径 # 指定路径挂载

在这里插入图片描述

初识DockerFile

DockerFile就是用来构建docker镜像的构建文件!命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。
在这里插入图片描述

数据卷容器

多个mysql实现数据共享

# mysql docker01
docker run -d -p 33061:3306 -v D:\docker\mnt\mysql\conf:/etc/conf.d -v D:\docker\mnt\mysql\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

# mysql docker02
# 通过--volumes-form mysql01实现数据同步
docker run -d -p 33061:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-form mysql01 mysql:5.7

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用。
但是一旦你持久化到了本地,这时候,本地的数据是不会删除的。

DockerFile

构建步骤:

  1. 编写一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub 阿里云镜像)

以centos为例,在docker hub上查看:
在这里插入图片描述
点击版本信息,跳转到github的dockerfile:
在这里插入图片描述
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!

DockerFile的构建过程

基础知识:
  1. 每个保留关键字(指令)都是必须大写字母
  2. 执行从上到下顺序执行
  3. 表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交!
    在这里插入图片描述
    Dockerfile的步骤:
    DockerFile:构建文件,定义一切的步骤,源代码
    DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品!
    Docker容器:容器就是镜像运行起来提供的服务器
DockerFile的指令
FROM       # 基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN        # 镜像构建的时候需要运行的命令
ADD        # 步骤,tomcat镜像,这是tomacat压缩包!添加内容
WORKDIR    # 镜像的工作目录 
VOLUME     # 挂载的目录
EXPOSE     # 保留端口配置
CMD        # 指定这个容器启动的时候要运行的命令
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD    # 当构建一个被继承 Dockerfile,这个时候就会运行onbuild
COPY       # 类似add,将我们文件拷贝到镜像中
ENV        # 构建的时候设置环境变量

在这里插入图片描述

实战测试

DockerHub中99%的镜像都是从基础镜像过来的From scratch,然后配置需要的软件和配置。
在这里插入图片描述

# 创建一个自己的镜像
新建文件mydockerfile-centos

# build镜像
docker build -f mydockerfile-centos -t mycentos:0.1 .

# docker history imagesID
我们平时查看镜像是如何做的,通过上面的命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布自己的镜像
DockerHub
1. 官网注册自己的账号
2. 确定这个账号可以登录
docker login -u 用户名
输入密码进入
3. 在我们服务器上提交自己的镜像
docker push taohy/
4. 登录完就可以提交镜像

登录账号:
在这里插入图片描述
在这里插入图片描述

在阿里云发布镜像
  1. 登录阿里云
  2. 找到容器镜像服务
  3. 创建命名空间
    在这里插入图片描述
  4. 创建容器镜像
    新建阿里云镜像仓库地址:
    在这里插入图片描述
  5. 浏览镜像仓库信息
    在这里插入图片描述
小结

在这里插入图片描述

Docker网络

网络详解

# 进入容器
PS C:\Users\taohy> docker exec -it  98da3ab14625 /bin/bash
# 查看容器的内部网络IP地址 172.17.0.3
root@98da3ab14625:/usr/local/bin/ignition# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 16  bytes 1072 (1.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9  bytes 602 (602.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1394  bytes 354097 (354.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1394  bytes 354097 (354.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# 再启动一个容器,查看ip地址 172.17.0.2 
root@801e60036d61:/usr/local/bin/ignition# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 472  bytes 373438 (373.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 430  bytes 33381 (33.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 708  bytes 173243 (173.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 708  bytes 173243 (173.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 思考,外机能否ping通主机容器内部?
Linux能ping通
winodws不能ping通

# 容器如何访问到Windows?
容器访问外机,默认的要用host.docker.internal

# 容器之间能互相通吗? 可以通 容器内:172.17.0.2 ping 172.17.0.3
root@801e60036d61:/usr/local/bin/ignition# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.051 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.037 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.052 ms

# 查看网络命令 docker network --help 
PS C:\Users\taohy> docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
075fff009f22   bridge    bridge    local
efbaf94573b8   host      host      local
29125732f2e0   none      null      local

# 查看网络具体信息
 docker network inspect 075fff009f22

在这里插入图片描述
在这里插入图片描述

# inspect 是查看具体信息,非常有用,不管是查看容器内部还是容器网络
docker inspect 容器ID
docker network inspect 网络ID

自定义网络

查看所有的docker网络

PS C:\Users\taohy> docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
075fff009f22   bridge    bridge    local
efbaf94573b8   host      host      local
29125732f2e0   none      null      local
网络模式

bridge :桥接 docker(默认,如果自己创建也用bridge)
none:不配置网络(用的少)
host:和主机共享网络
container:容器网络连接(用的少)

网络测试
# 创建自定义的网络bridge:
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

# 创建之后查看网络,mynet
PS C:\Users\taohy> docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
075fff009f22   bridge    bridge    local
efbaf94573b8   host      host      local
6c3a287738b3   mynet     bridge    local
29125732f2e0   none      null      local


在这里插入图片描述

# 启动容器放在自定义网络 --net 
docker  run -d -P --name tomcat-net-01 --net mynet tomcat

在这里插入图片描述

网络连通

容器连接到一个网络:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
结论:
假设要跨网络操作别人,就需要使用docker network connect 连通!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐