docker 安装及构建流程

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

docker的使用极大地简化了开发部署流程,编写一次代码,便可以在不同的机器上完美运行。

0. 基本概念

  • 镜像(image)

如果把docker比喻为虚拟机,那么镜像即为虚拟机中的iso文件。Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。

  • 容器(container)

如果把镜像比为面向对象语言中的一个类,那么容器即为类的一个实例。镜像只是一堆可读的系统文件,容器是在其上层添加了可写层的读写文件,只有镜像实例化成容器才是可运行的。

  • 仓库(repository)

镜像仓库的概念与github是类似的,是存放各种镜像的地方。当我们执行docker pull image的时候,docker默认是从dockerhub上去查找我们所需要的镜像文件,然后执行下载操作。这类的镜像仓库就是docker默认的公共仓库,所有人都可以直接查看或下载、使用。有时为了内部分享使用,通常在本地搭建离线的私有化镜像仓库。

1. 下载安装docker

  • 脚本安装

docker官方提供了十分便利的脚本,在有网环境下,只需运行以下代码便可以安装,使用aliyun国内源以加快下载速度。

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
systemctl start docker
systemctl enable docker
  • apt/yum源下载

也可配置软件源进行安装:

deb:

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

yum:

curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo > /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
  • 离线二进制安装

无网环境下使用二进制包方式进行安装,从网址https://download.docker.com/linux/找到对应系统版本以及系统架构下载对应包即可。

启动docker后,查看docker版本以确认是否安装成功:

(base) wildkid1024@debian:~$ docker version
Client: Docker Engine - Community
 Version:           20.10.14
 API version:       1.41
 Go version:        go1.16.15
 Git commit:        a224086
 Built:             Thu Mar 24 01:48:21 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.14
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.15
  Git commit:       87a90dc
  Built:            Thu Mar 24 01:46:14 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.5.11
  GitCommit:        3df54a852345ae127d1fa3092b95168e4a88e2f8
 runc:
  Version:          1.0.3
  GitCommit:        v1.0.3-0-gf46b6ba
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

2.拉取远程基础镜像

开发项目之前需先拉取对应基础镜像环境,可从dockhub下载任意开发使用的必要环境,比如python:3.6:

(base) wildkid1024@debian:~$ docker pull python:3.6

3.6: Pulling from library/python
Digest: sha256:f8652afaf88c25f0d22354d547d892591067aa4026a7fa9a6819df9f300af6fc
Status: Image is up to date for python:3.6
docker.io/library/python:3.6

拉取完成可以测试下环境是否成功:

(base) wildkid1024@debian:~$ docker run -it python:3.6 python
Python 3.6.15 (default, Dec 21 2021, 12:03:22) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

3. 构建本地项目

以一个flask项目为例,演示如何构建本地项目:

首先拉取Python镜像,并移动到项目目录下,在项目根目录下添加Dockerfile镜像,内容如下:

FROM python:3.6
WORKDIR ./

COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

COPY . .

CMD ["python", "start.py"]

其中FROM声明要使用的镜像名称及版本,WORKDIR声明工作目录,requirements中声明flask版本和对应的python依赖。

然后构建镜像,便会生成一个用于生产环境的docker镜像:

docker build -t flask_app .

4. 镜像的导入导出

如果上述构建未出错的话,那么将在docker本地镜像中找到两个镜像,通过运行docker images来找到他们。

通过以下导入导出镜像命令可将生产镜像导出:

docker save image_id > image_export.tar 
docker load  <  image_export.tar

-------- 完结 -----------