系统依赖
对于ubuntu操作系统,Docker Engine目前支持以下几个版本
- Ubuntu Focal 20.04 (LTS)
- Ubuntu Bionic 18.04 (LTS)
- Ubuntu Xenial 16.04 (LTS)
在系统架构上,Docker Engine目前只支持x86_64
oramd64
,armhf
,arm64
等系统架构
- 查看自己的系统架构
1 | arch |
卸载旧的版本
1 | sudo apt-get remove docker docker-engine docker.io containerd runc |
如果提示
1 | Reading package lists... Done |
很可能是你的ubuntu操作系统开启了每天自动更新,apt-get被占用了,关掉自动更新,或者等他自动更新完
How to Fix ‘E: Could not get lock /var/lib/dpkg/lock’ Error in Ubuntu Linux
添加docker 官方仓库
更新apt的package index并允许apt使用https
如果因为网络问题更新速度慢的话,请用你的网络代理工具开启全局代理
如果你连网络代理工具也没有的话,自行解决1
2
3
4
5
6
7
8$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
- 添加docker官方的GPGkey
1 | $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - |
验证一下你的key的签名是否9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
.搜索后八位即可
1 | $ sudo apt-key fingerprint 0EBFCD88 |
- 添加docker仓库
根据你的ubuntu的系统架构安装docker engine下面是amd64的安装命令
1 | $ sudo add-apt-repository \ |
其他系统架构的命令请参考官方文档
安装docker engine
- 继续更新 apt的package index 然后安装docker engine
1 | $ sudo apt-get update |
要安装指定版本的docker engine 请参考官方文档
2. 验证docker engine 是否安装成功
1 | $ sudo docker run hello-world |
可以看到这个命令先去本地寻找hello-world:latest镜像,找不到就去dockerhub仓库拉,然后根据拉取镜像生成容器运行,运行结束退出容器
Docker 需要用户具有 sudo 权限,为了避免每次命令都输入sudo,可以把用户加入 Docker 用户组,然后重新登陆linux用户就好了,注意是你要注销当前用户再登陆
1 | sudo usermod -aG docker $USER |
镜像下载加速
使用阿里云镜像源下载
1 | sudo mkdir -p /etc/docker |
安装docker-compose
1 | sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose |
脚本一键安装
装不好就算了,我自己写的
1 | git clone git@github.com:johnson329/MyUtils.git |
Image和Container概念
- image
Docker 把应用程序及其依赖,打包在 image 文件里面
- container
根据image生成的容器
image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
更多概念请参考阮一峰的博客
docker安装mysql服务
再看一个真实一点的例子,用docker安装mysql
1 | # 拉取mysql |
这样,一个mysql容器就起来了,我们可以用navicat测试一下连接
docker-compose安装mysql服务
每次都要敲命令实在太麻烦了,这次敲完下次又要重新来一遍,简直噩梦
更噩梦的是如果有多个服务,比如还有redis,rabbitmq,都要去敲命令,那简直累死
所以,相比于命令式的启动方式
我们还可以用声明的方式启动vim docker-compose.yml
1 | version: '3' |
这里声明了两个service,名字分别为mysql-db和rabbitmq
剩下的都是对应docker run后面的参数了,注意volumes表示的是把容器内外的文件夹作映射,比如mysql产生的数据我们不能放在容器里面,万一容器被删除了,数据就没了,所以我们一般把容器内的数据用volumes
挂在出来。
而且,mysql
需要的配置文件,我们一般会实现写好,然后映射到mysql
容器内部,让容器使用这个启动配置文件,这些都是通过volumes
实现的
1 | docker-compose -f docker-compose.yml up -d |
这样我们就安装了mysql和rabbitmq服务
当然像这样的docker-compose.yml
你可以去网上找,只要你理解了文件的意思即可。这可比以前那种安装包的方式轻松多了
制作自己的image镜像
例如我们写了一个 flask
项目,像这样 app.py
1 | from flask import Flask |
requirements.txt
1 | click==7.1.2 |
我们可以把代码提交到仓库,然后在部署服务器上拉下代码,然后用gunicorn部署,像这样 gunicorn -w 4 app:app
如果用docker部署呢?
- 制作Dockerfile文件
1 | FROM python:3.6 |
- 打包镜像
1 | docker build -t flask_project_image:0.1 . |
-t
表示给镜像打上flask_project_image:0.1的标签
.表示使用当前目录下的Dcokerfile文件
- 启动
1 | docker run --name flask_project_container -d flask_project_image:0.1 |
表示以后台启动的方式启动一个名为flask_project_container
的容器
镜像是 flask_project_image:0.1
- 查看日志
1 | docker logs -f flask_project_container |
- 进入到容器内部
1 | docker exec -it flask_project_container bash |
- 停止容器,但是容器没有被删除,只是不运行了
1 | docker stop flask_project_container |
- 删除容器
1 | docker rm flask_project_container |
容器管理
使用容器我们可以很方便的部署我们的项目,一般项目是从单体开始,等流量上来以后,我们可以采用单体集群的方式,也就是再启动一个flask
项目容器,前面放一个网关,让网关做负载均衡,这样就可以很容易横向扩展,当然前提瓶颈在代码运行环节。
但流量有高峰有低估,总不能一直跑着几十个容器占用服务器资源
我们希望我们的容器能根据负载,例如根据cpu占用率或者内存占用率自动扩容(增加容器)缩容(减少容器)
这就是kubernets
又叫k8s
做的事情,它是一个容器集群管理系统,可以做到自动化部署、自动扩容和自动缩容
不过谷歌今年服务也出现了短时间大面积不可用,也不咋地嘛
k8s
的教程请看董明伟的博客