Docker

什么是Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

安装

  1. 先更新apt-get最新安装包

    apt-get update
    
  2. 使用apt-get安装docker

    apt-get install -y docker.io
    

Docker配置

docker是需要去下载镜像的,默认会从docker hub上去下载,由于docker hub的服务器是在国外的,在国内下载速度会比较慢,这个时候就需要用到加速器,这里我们使用阿里云的加速器

  • 阿里云加速器配置(https://cr.console.aliyun.com/)

    打开上面的网站,登陆你的阿里云账号后会跳转到【容器镜像服务】页面,在左边的菜单栏中打开【镜像工具】下的【镜像加速器】,在这里选择针对自己系统的加速器文档,会有详细说明,如何配置镜像加速器

Docker的基本使用

使用这条命令将mysql的镜像pull下来

docker pull mysql:5.7

下载完以后将mysql镜像运行起来,至此,仅通过两行代码就完成了mysql的下载、安装和运行。后面会对docker run的参数进行详解

docker run -p 3306:3306 --name mysql5.7 -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

版本查看

使用docker version查看当前docker客户端和服务端版本

root@ubuntu-master:/etc/docker# docker -v
Docker version 20.10.7, build 20.10.7-0ubuntu5~18.04.3
root@ubuntu-master:/etc/docker# docker version
Client:
 Version:           20.10.7
 API version:       1.41
 Go version:        go1.13.8
 Git commit:        20.10.7-0ubuntu5~18.04.3
 Built:             Mon Nov  1 01:04:14 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server:
 Engine:
  Version:          20.10.7
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.8
  Git commit:       20.10.7-0ubuntu5~18.04.3
  Built:            Fri Oct 22 00:57:37 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.5.5-0ubuntu3~18.04.2
  GitCommit:        
 runc:
  Version:          1.0.1-0ubuntu2~18.04.1
  GitCommit:        
 docker-init:
  Version:          0.19.0
  GitCommit:

镜像拉取

使用上面演示的docker pull

docker pull mysql:5.7

镜像查询

使用 docker image ls便可查看本地镜像仓库所拥有的镜像

root@ubuntu-master:/etc/docker# docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mysql        5.7       c20987f18b13   2 months ago   448MB

或者使用 docker images 来实现相同的功能

root@ubuntu-master:/etc/docker# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mysql        5.7       c20987f18b13   2 months ago   448MB

镜像删除

这里方便演示,先下载一个nginx,再将其删除

root@ubuntu-master:/etc/docker# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete 
a9edb18cadd1: Pull complete 
589b7251471a: Pull complete 
186b1aaa4aa6: Pull complete 
b4df32aa5a72: Pull complete 
a0bcbecc962e: Pull complete 
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

下载好之后,使用docker rmi nginx删除nginx镜像

root@ubuntu-master:/etc/docker# docker rmi nginx
Untagged: nginx:latest
Untagged: nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
Deleted: sha256:b625d8e29573fa369e799ca7c5df8b7a902126d2b7cbeb390af59e4b9e1210c5
Deleted: sha256:7850d382fb05e393e211067c5ca0aada2111fcbe550a90fed04d1c634bd31a14
Deleted: sha256:02b80ac2055edd757a996c3d554e6a8906fd3521e14d1227440afd5163a5f1c4
Deleted: sha256:b92aa5824592ecb46e6d169f8e694a99150ccef01a2aabea7b9c02356cdabe7c
Deleted: sha256:780238f18c540007376dd5e904f583896a69fe620876cabc06977a3af4ba4fb5
Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f

容器运行

使用docker run来运行一个容器

  • 端口映射 -p

    当前的 -p 3306:3306的意思是:

    参数是将当前操作系统的3306端口跟容器内部的3306端口做一个映射,当我们访问当前操作系统3306端口的时候其实就是访问的就是容器的3306端口

  • 容器名称 --name

    指定当前需要运行容器的名称,方便后续对容器的查找

  • 挂存储卷 -v

    docker容器它可以被理解为是一个进程,由于进程在电脑断电的时候会从内存中擦除,所运行的数据并没有被保存下来,比如说现在用到的数据库,是需要对数据进行持久化保存下来的,那该怎么办呢,这时候就需要对mysql的镜像挂一个存储卷

    当前的-v /home/mysql/data:/var/lib/mysql的意思是:

    将当前操作系统的/home/mysql/data 的目录跟容器的/var/lib/mysql 目录做一个映射,容器目录中生成的内容将会被存储至当前操作系统的目录中去,这样当容器重启或者机器断电的时候就可以保证数据不会丢失

docker run -p 3306:3306 --name mysql57 -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

查看容器

使用docker ps查看当前运行的容器

root@ubuntu-master:/etc/docker# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
249817bfdb3b   mysql:5.7   "docker-entrypoint.s…"   31 seconds ago   Up 28 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql57

当前查看到的容器的STATUS状态是Up的则表明,当前容器时正在运行的

如果要查看其他状态的容器,则可以使用docker ps -a 查看所有状态的容器

进入容器

使用docker exec 进入一个容器

  • -it

    当前参数指定容器的CONTAINER ID

  • /bin/bash

    指定进入容器的工具

root@ubuntu-master:/etc/docker# docker exec -it 249817bfdb3b /bin/bash
root@249817bfdb3b:/# ls
bin  boot  dev	docker-entrypoint-initdb.d  entrypoint.sh  etc	home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

以上我们便进入到了一个容器的内部,并查看了其根目录的所有内容

退出容器

和大多数连接工具一样 使用 exit 退出容器

容器日志

使用docker logs 查看当前容器运行日志

  • -f 类似于tail -f 命令

    循环读取

  • 指定要查看的容器CONTAINER ID

root@ubuntu-master:/etc/docker# docker logs 249817bfdb3b 
2022-03-09 08:03:46+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.36-1debian10 started.
2022-03-09 08:03:46+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2022-03-09 08:03:46+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.36-1debian10 started.
2022-03-09 08:03:47+00:00 [Note] [Entrypoint]: Initializing database files
......
2022-03-09T08:04:06.969091Z 0 [Note] Event Scheduler: Loaded 0 events
2022-03-09T08:04:06.970159Z 0 [Note] mysqld: ready for connections.
Version: '5.7.36'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

出现日志末尾的mysqld: ready for connections.则代表mysql3306端口已经启动起来了

设置环境变量

当使用docker命令行的时候可以附加一些专门给容器使用的变量,好比上面运行mysql容器的时候通过-e 参数指定了mysql容器内部运行时所需要的环境变量MYSQL_ROOT_PASSWORD,通过这个变量,mysql在安装运行的时候就可以设置一个ROOT密码,在镜像的说明文档中就可以查看。

容器停止

通过docker stop即可停止一个正在运行的容器

  1. 先使用docker ps查看正在运行的容器

    root@ubuntu-master:/etc/docker# docker ps -a
    CONTAINER ID   IMAGE       COMMAND                  CREATED             STATUS             PORTS                                                  NAMES
    249817bfdb3b   mysql:5.7   "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql57
    
  2. 使用docker stop停止这个容器

    • 需要传递容器的CONTAINER ID
    root@ubuntu-master:/etc/docker# docker stop 249817bfdb3b
    249817bfdb3b
    root@ubuntu-master:/etc/docker# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    root@ubuntu-master:/etc/docker# docker ps -a
    CONTAINER ID   IMAGE       COMMAND                  CREATED             STATUS                      PORTS     NAMES
    249817bfdb3b   mysql:5.7   "docker-entrypoint.s…"   About an hour ago   Exited (0) 53 seconds ago             mysql57
    

这里我们看到停止mysql容器后,使用docker ps查看发现运行中的容器已经没有了,通过使用 docker ps -a 我们看到mysql 容器已经处于退出状态了,当我们需要继续运行的时候只需要执行docker run 249817bfdb3b 即可重新运行该容器

容器删除

使用docker rm 即可删除一个容器

root@ubuntu-master:/etc/docker# docker rm 249817bfdb3b
249817bfdb3b
root@ubuntu-master:/etc/docker# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

仓库登陆

可以在阿里云的【容器镜像服务】下的【实例列表】下的【镜像仓库】中了解如何登陆仓库,这里不过多介绍

镜像构建

把本地的代码打包成一个镜像

docker build -t anyname:1.0 .

  • anyname 给镜像取个名字
  • :1.0 给镜像打个tag
  • . 指定在当前目录去寻找dockerfile,根据dockerfile执行镜像的构建,当然也可以手工指定一个docker file的路径,使用 -f /root/xxx

镜像打tag

打完镜像以后再给镜像打一个tag,类似于打一个版本号,1.0、2.0这种

上面的例子是在执行build的同时打了镜像的tag,这里可以对其他已经拥有的镜像进行打个tag

这里我们对已拥有的nginx镜像打个tag

root@ubuntu-master:/etc/docker# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   2 months ago   141MB
mysql        5.7       c20987f18b13   2 months ago   448MB
root@ubuntu-master:/etc/docker# docker tag nginx myrepository/mynginx:1.0
root@ubuntu-master:/etc/docker# docker images
REPOSITORY             TAG       IMAGE ID       CREATED        SIZE
nginx                  latest    605c77e624dd   2 months ago   141MB
myrepository/mynginx   1.0       605c77e624dd   2 months ago   141MB
mysql                  5.7       c20987f18b13   2 months ago   448MB

docker tag nginx myrepository/mynginx:1.0

  • nginx 当前本地镜像仓库已拥有的镜像名称
  • myrepository/mynginx 新的镜像名称,这里建议指定为(远程镜像仓库+镜像名称)方便后期使用docker push
  • :1.0 指定tag,这里大多数都是版本号

镜像推送

打完tag后将镜像推送到镜像仓库,以后就可以通过docker pull下来,进行docker run了

root@ubuntu-master:/etc/docker# docker images
REPOSITORY             TAG       IMAGE ID       CREATED        SIZE
nginx                  latest    605c77e624dd   2 months ago   141MB
myrepository/mynginx   1.0       605c77e624dd   2 months ago   141MB
mysql                  5.7       c20987f18b13   2 months ago   448MB

上面通过查出要push的镜像,可以看到刚刚打完tag的镜像名称其实就是现在需要push的远程镜像仓库地址,这边直接复制本地镜像的名称,然后push。

docker push myrepository/mynginx:1.0

以上指令是将mynginx:1.0 这个镜像push到myrepository 这个镜像仓库去。

DockerFile基本语法

FROM

基于这个基础镜像的环境,执行下文的命令

FROM ubuntu:18.04

上述代码为基于ubuntu18这个版本去运行下文的程序

RUN

通过RUN执行任意的Linux的命令

RUN apt-get update
RUN apt-get upgrade
RUN apt-get install -y python3 python

ADD

拷贝文件,也可以理解为添加文件

ADD ./ /usr/local/xxx

上述代码为:将当前docker file 文件所在目录./ 拷贝至FROM指定的基础镜像的/usr/local/xxx 这个目录中去

WORKDIR

设置工作目录,类似于cd /xx

WORK /usr/local/xxx

进入这个工作目录

CMD/ENTRYPOINT

CMD [”python3”,”./main.py”]

使用python3运行刚刚进入的工作目录下的main.py程序

EXPOSE

EXPOSE 5000

容器对外暴露的端口是5000