十分钟掌握 Docker 基本使用

时间那么宝贵哪有一个小时学习一个新的技能!那么十分钟呢?本文记录工作中需要快速使用 docker 的几个场景,真正帮你十分钟入门!

  • 场景一:了解何为 Docker

如果你不太了解 Docker,还是自己搜一下吧,本文基于你至少知道 Docker 干啥用的;Docker 是通过标准的配置文件来创造统一的开发或者生产环境的一个工具,其核心就是镜像(已经配置好了各种环境)。

  • 场景二:配置 Docker 国内镜像

没啥好说的,直接上方法

如果你是安装的 Mac 或者 Windows 客户端都可以按照图所示配置镜像地址

image.png

Linux 下:

# vi /etc/docker/daemon.json
{
    "registry-mirrors": ["http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"]
}
# 然后根据你是Ubuntu还是Centos等其他系统,重启docker服务即可
  • 场景三:快速查找、下载你需要的 Docker 环境
# 查找环境(后面的 `--no-trunc` 是为了完整输出描述信息)
# 你也可以去 `https://hub.docker.com/` 网站搜索,搜索功能更强大
docker search mysql --no-trunc
# 搜索某个镜像的tags(这个docker并未提供原生命令,解决方案都是利用docker提供的开放api进行搜索,或者去 `https://hub.docker.com/` 查阅
# 本命令来自 `https://stackoverflow.com/questions/28320134/how-can-i-list-all-tags-for-a-docker-image-on-a-remote-registry`)
wget -q https://registry.hub.docker.com/v1/repositories/ubuntu/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'
# 下载某个镜像
docker pull mysql
# 下载某个特定 `tags`(通常是版本号)的镜像,强烈建议制定 `tags` 下载,尤其是生产环境
docker pull mysql:8.0
# 删除某个镜像
docker rmi mysql
  • 场景四:基于某个镜像创建、运行并进入容器
# 查看所有容器
docker ps -a # -a 参数可以查看已停止运行的容器
# 基于某个镜像创建容器并运行
docker create -it --name='ubuntu-20' ubuntu  # 参数 `-it` 标识了可以支持标准输入输出,通常一起使用 `--name` 为该容器起个名字,强烈建议一定起一个独立名字
docker start ubuntu-20 # 启动该容器
docker exec -it ubuntu-20 /bin/bash # 在该容器运行交互命令行工具,即可进入容器

# 快速创建并运行
# 这是一条整合命令,相当于上面的三条,特别注意,如果不添加 `-d` 参数,运行后直接进入到容器交互模式,如果此时exit退出,则容器会自动停止,`-d` 是保证后台运行
docker run -it -d --name='ubuntu-20' ubuntu /bin/bash
# 容器操作是docker中最复杂的功能,需要多多学习研究

# 运行退出后自动删除容器 --rm 参数
docker run -it --rm -d --name='ubuntu-20' ubuntu /bin/bash
  • 场景五:映射本地端口及文件目录
# Docker 最核心的功能就是代替宿主机运行我们的服务(尤其是微服务),所以要开放端口给外界能够访问,开发环境中还要开放目录方便代码及配置共享,调试发布镜像

# `-P` 自动映射所有开放的端口, 映射多个直接指定多个 `--expose` 参数即可
docker run -it -d -P --name=port-test --expose=8000 --expose=8001 ubuntu /bin/bash
# `-p` 指定端口映射,通常我们都是使用-p指定端口,方便自动化运维
docker run -it -d -p 8000:8000 --name=port-test ubuntu /bin/bash

# 查看容器映射的端口
docker port port-test
# 8000/tcp -> 0.0.0.0:55002
# 8000/tcp -> :::55002

# 映射目录Docker提供了两个参数,分别是不同的方式,其中 `-v` 足够平时开发调试使用,如果是使用更加完善的文件管理,请使用 `--mount` 参数,这里只记录下 `-v` 的使用:
docker run -it -d -v /path/to/source/test:/www --name=share-test ubuntu /bin/bash
# 进入容器后,可发现 `/www` 可访问
  • 场景六:固定 Docker 容器 IP,更方便自动化

Docker 安装后,会创建三种网络类型,在创建容器时可指定其中一种; docker run 时可通过 --network 参数指定网卡类型

$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
e6eaace1cd3e   bridge    bridge    local  #创建虚拟网卡进行通信
a6a9b06010ae   host      host      local  #与主机共享网卡,特别提醒:该模式仅支持Linux系统,Mac下指定该模式后容器内的IP与主机不一致,且主机无法访问容器内
547191ac0139   none      null      local  #无网络链接

非特别场景(比如对网络要求超高)一般都会配置为 bridge,该模式下默认重启容器则会从新分配 IP,并且默认虚拟网卡下 --ip参数是无效的,必须通过创建一个自定义虚拟网卡,达到固定 IP 的目的

# 指定网卡网段,注意下面两条命令分别创建了B类和C类IP两个网段的网卡,具体了解可自行百度,实际使用可选用 `--subnet=172.18.0.0/16` B类网段,IP地址很多,足够用了
docker network create --subnet=172.18.0.0/16 mynetwork
docker network create --subnet=192.168.22.0/24 mynetwork192

# 创建容器并指定IP
docker run -itd --name net172 --net=mynetwork --ip=172.18.0.2 ubuntu /bin/bash

Posts in this Series