Docker
什么是Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
安装
-
先更新apt-get最新安装包
apt-get update -
使用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指定当前需要运行容器的名称,方便后续对容器的查找
-
挂存储卷
-vdocker容器它可以被理解为是一个进程,由于进程在电脑断电的时候会从内存中擦除,所运行的数据并没有被保存下来,比如说现在用到的数据库,是需要对数据进行持久化保存下来的,那该怎么办呢,这时候就需要对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即可停止一个正在运行的容器
-
先使用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 -
使用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