Docker基础入门-01

Docker

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

可以让开发者打包应用以及依赖包到一个轻量级、可移植的容器中,然后发布到其他Linux系统上,以实现虚拟化。

优点

  • 快速、一致地交付应用(避免在我的电脑上能运行,你那怎么就报错的情况发生)
  • 响应式部署和扩展
  • 在同一硬件上运行更多工作负载

Docker 官网:https://www.docker.com

GitHub Docker 源码:https://github.com/docker/docker-ce

架构

概念

Docker包括三个基本概念:

  • 镜像(Image): Docker镜像(Image)相当于一个root文件系统

  • 容器(Container): 容器相当于镜像的一个实例,类比面向对象程序中的类和对象一样,镜像是静态的定义,容器是镜像的一个实例。实例(容器)可以被创建、启动、停止、删除。

  • 仓库(Repository): 类似于代码仓库git,用于保存镜像

Docker OOP
Container Object
Images Class

结构

img

概念 说明
Images Docker Images是创建容器的模板
Container 容器是镜像运行的一个实体。
Client 客户端通过命令行工具或Desktop等与Docker通信
Host 宿主(服务器),用于执行Docker守护进程和容器
Registry 镜像仓库,public/private 仓库
Machine 命令行工具

安装

环境:Centos7.9

cpu-memery

1
2
uname -a	# 查看机器信息 3.8以上
cat /etc/redhat-release # Linux版本

image-20211128125004040

卸载旧版本

可以先检查是否安装过旧版本的Docker,如果安装过则需要先卸载依赖项。

1
2
3
4
5
6
7
8
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

配置仓库

安装yum-utils

1
sudo yum install -y yum-utils

设置仓库:

  • 官方源:

    1
    2
    3
    sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  • 阿里云:

    1
    2
    3
    sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

这里我们使用阿里云的仓库,国内访问比较快。

Docker引擎

安装Docker Engine:

1
sudo yum install docker-ce docker-ce-cli containerd.io

启动Docker:

1
2
3
systemctl start docker	# 启动
systemctl stop docker # 停止
systemctl restart docker # 重启

配置自启动

1
2
sudo systemctl enable docker.service
sudo systemctl enable containerd.service

禁用则使用disable

检查是否安装成功:

1
2
3
[root@local yum.repos.d]# docker -v
Docker version 20.10.8, build 3967b7d
[root@local yum.repos.d]#

卸载

  • 卸载Docker Engine、CLI和Containerd包:

    1
    sudo yum remove docker-ce docker-ce-cli containerd.io
  • 删除所有镜像、容器和卷

    1
    2
    sudo rm -rf /var/lib/docker
    sudo rm -rf /var/lib/containerd

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

镜像加速

国内从Docker Hub拉取镜像可能会比较慢,推荐配置国内的镜像加速器

获取个人阿里镜像加速器:

找到容器镜像服务

image-20211128131145813

镜像工具 => 镜像加速器

image-20211128131239013

配置镜像加速器

修改daemon配置文件/etc/docker/daemon.json

1
2
3
4
5
6
7
vi /etc/docker/daemon.json

# 添加镜像地址
"registry-mirrors": ["https://yoursId.mirror.aliyuncs.com"]

sudo systemctl daemon-reload
sudo systemctl restart docker

image-20211128131513972

检查是否生效

1
docker info

image-20211128133728211

Docker容器使用

1
[root@local ~]# docker
image-20211128134120395

使用 docker [cammand] --help查看命令使用方法

1
docker run --help
image-20211128134321971

获取镜像

从镜像仓库拉取镜像

命令:docker pull [OPTIONS] NAME[:TAG|@DIGEST]

1
2
docker pull  -q nginx  # -q 不输出 
docker images # 查看镜像列表

image-20211128134754794

启动容器

启动一个新的容器实例

命令:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

1
2
3
4
5
docker run --name my_nginx -p 80:80 -d nginx

[root@local ~]# docker run --name my_nginx -p 80:80 -d nginx
2fc689cc169c994ffec7aeadacbedfc13ff4de540fb3e5e7c85520f2d4da5fde
[root@local ~]#
  • –name:指定容器的名称
  • -p:映射的端口
  • -d : 后台运行

浏览器访问我们的容器,可以看到nginx已经启动。

image-20211128135337874

查看所有容器

命令:docker ps [OPTIONS]

image-20211128135638225

1
2
3
4
5
6
docker ps -a

[root@local ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2fc689cc169c nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp my_nginx
[root@local ~]#

启动容器

命令:docker start [OPTIONS] CONTAINER [CONTAINER...]

1
2
docker start my_nginx
docker restart my_nginx # 重启容器

停止容器

1
2
3
4
5
6
docker stop my_nginx # 停止名称为my_nginx的容器
docker stop 2fc689cc169c # container Id

[root@local ~]# docker stop my_nginx
my_nginx
[root@local ~]#
1
2
3
4
5
6
7
8
[root@local ~]# docker stop --help

Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...]

Stop one or more running containers

Options:
-t, --time int Seconds to wait for stop before killing it (default 10)

进入容器

在正在运行的容器中运行命令

命令:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

1
docker exec -it my_nginx /bin/bash

image-20211128141608965

相当于进入容器内部,一个隔离的Linux系统,使用exit退出

导入导出

导出

导出容器镜像文件

命令:docker export [OPTIONS] CONTAINER

1
docker export my_nginx > my_nginx.tar

image-20211128142032945

导入

导入镜像

命令:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

这里我将导出的镜像文件放到win系统中,使用Docker Desktop导入

1
docker import .\my_nginx.tar my_nginx

image-20211128142745839

删除容器

命令:docker rm [OPTIONS] CONTAINER [CONTAINER...]

1
docekr rm my_nginx

可选参数:

  • -f : 强制删除正在运行的容器(不加这个参数则需要先docker stop containerId
  • -v : 移除与容器相关的数据卷

image-20211128144931845

查看日志

命令: docker logs [OPTIONS] CONTAINER

1
docker logs -f -n 100 my_nginx
  • -f : 跟踪日志输出
  • -n : 从日志末尾显示的行数(默认:全部)
image-20211128144724047

查看端口

1
2
3
4
[root@local ~]# docker port  my_nginx
80/tcp -> 0.0.0.0:80
80/tcp -> :::80
[root@local ~]#

Docker 镜像使用

使用docker run 运行容器时,如果在本地没有找到镜像则会自动从Docker Hub拉取镜像。

image-20211128145350390

查看镜像列表

1
2
3
4
[root@local ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ea335eea17ab 10 days ago 141MB
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
  • REPOSITORY : 镜像仓库源(默认:Docker Hub)
  • TAG :镜像标签 默认拉取latest,可指定版本 docker pull nginx:xxx
  • IMAGE ID : 镜像ID
  • CREATED : 创建时间
  • SIZE : 镜像大小

查找镜像

命令: docker search [OPTIONS] TERM

1
docker search --limit 10 nginx # 返回10条结果
image-20211128150050740
  • NAME : 镜像仓库源名称
  • DESCRIPTION : 描述
  • STARS : 点赞数
  • OFFICIAL : 是否官方发布
  • AUTOMATED : 自动构建

拉取镜像

命令:docker pull [OPTIONS] NAME[:TAG|@DIGEST]

1
2
3
docker pull nginx # 拉取默认版本
docker pull nginx:xxx # 拉取指定版本
docker pull -q nginx # 无输出
1
2
3
4
5
6
7
8
9
10
11
12
[root@local ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
eff15d958d66: Pull complete
1e5351450a59: Pull complete
2df63e6ce2be: Pull complete
9171c7ae368c: Pull complete
020f975acd28: Pull complete
266f639b35ad: Pull complete
Digest: sha256:097c3a0913d7e3a5b01b6c685a60c03632fc7a2b50bc8e35bcaa3691d788226e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

image-20211128150647218

删除镜像

命令: docker rmi [OPTIONS] IMAGE [IMAGE...]

1
docker rmi hello-world:latest

image-20211128183009721

构建镜像

命令:docker build [OPTIONS] PATH | URL | -

image-20211128191400815

设置镜像标签

命令: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

1
docker tag nginx:latest jontymin/my_nginx

image-20211128192133803

镜像仓库

仓库(Repository)是集中存放镜像的地方(类比git仓库)

Docker官方维护了一个公共仓库,需要注册账号以推送镜像 https://hub.docker.com/

1578550749282

上图为Docker容器和本地仓库、远程仓库的关系

登录

1
docker login 
  • -p : 密码
  • -u : 用户名
1
2
3
4
5
6
7
8
[root@local ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: jontymax
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

推送镜像

命令 : docker push [OPTIONS] NAME[:TAG]

1
docker push jontymax/my_nginx

image-20211128215642468

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