先决条件:

在linux下实现安装好docker环境

一、安装Docker

  • 1.下载关于Docker的依赖环境
yum -y install yum-utils device-mapper-persistent-data lvm2
  • 2.设置下载Docker的镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 3.安装Docker
yum makacache fast
yum -y install docker-ce

如果出现以下错误:

[root@localhost ~]# yum makacache fast
已加载插件:fastestmirror, langpacks
没有该命令:makacache。请使用 /usr/bin/yum --help

解决:

[root@localhost ~]# yum clean all
已加载插件:fastestmirror, langpacks
正在清理软件源: base docker-ce-stable extras updates
Cleaning up list of fastest mirrors

[root@localhost ~]# yum makecache fast
已加载插件:fastestmirror, langpacks
Determining fastest mirrors
 * base: ty1.mirror.newmediaexpress.com
 * extras: ty1.mirror.newmediaexpress.com
 * updates: ty1.mirror.newmediaexpress.com
base                                                                                | 3.6 kB  00:00:00     
docker-ce-stable                                                                    | 3.5 kB  00:00:00     
extras                                                                              | 2.9 kB  00:00:00     
updates                                                                             | 2.9 kB  00:00:00     
(1/6): docker-ce-stable/x86_64/updateinfo                                           |   55 B  00:00:00     
(2/6): docker-ce-stable/x86_64/primary_db                                           |  48 kB  00:00:00     
(3/6): base/7/x86_64/group_gz                                                       | 153 kB  00:00:01     
(4/6): extras/7/x86_64/primary_db                                                   | 222 kB  00:00:01     
(5/6): updates/7/x86_64/primary_db                                                  | 3.7 MB  00:00:02     
(6/6): base/7/x86_64/primary_db                                                     | 6.1 MB  00:00:14     
元数据缓存已建立
  • 4.启动Docker,并设置为开机自动启动
# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker

以上就完成了docker的安装!

二、Docker的中央仓库

  • Docker官方的中央仓库: 这个仓库是镜像最全的,但是下载速度较慢。
https://hub.docker.com/
  • 国内的镜像网站:网易蜂巢、daoCloud。。。
https://c.163yun.com/hub#/home
https://hub.daocloud.io/ (推荐使用)

在公司内部会采用私服的方式拉取镜像。(添加配置)

仓库配置如下:
在 Linux 环境下,通过命令vim /etc/docker/daemon.json修改这个 Docker 服务的配置文件,也就是在该文件夹内配置docker的国内镜像源 ( 如果文件不存在,可以直接创建它 ) 。在配置文件中输入以下命令:

{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}

配置后保存文件退出,重新启动Docker

systemctl restart docker

通过docker info命令来查阅当前的配置是否生效,如果在消息中显示出:

[root@localhost docker]# docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.14
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: ea765aba0d05254012b0b9e595e995c09186427f
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-957.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 1.777GiB
 Name: localhost.localdomain
 ID: VWIY:6WNZ:KL53:WEVM:73LX:TKKG:L3KQ:NY6K:LLLW:GPQG:X2KW:Z6XA
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://docker.mirrors.ustc.edu.cn/
 Live Restore Enabled: false
常用镜像
  • Docker中国区官方镜像
https://registry.docker-cn.com
  • 网易
http://hub-mirror.c.163.com
  • 中国科技大学
https://docker.mirrors.ustc.edu.cn
1.在centOS下部署一个简单的flask项目文件start.py,如下:

项目目录:/home/www/test

from flask import Flask


app = Flask(__name__)

@app.route('/')
def test():
  return 'This is Flask!'


if __name__ == '__main__':
  app.run(host='0.0.0.0', port=8080)
2.需安装的插件
gunicorn
gevent
flask

导出已安装好的插件

pip freeze > requirements.txt

其中guincorn是支持wsgi协议的http server,gevent只是它支持的模式之一 ,是为了解决django、flask这些web框架自带wsgi server性能低下的问题。它的特点是与各个web框架结合紧密,部署特别方便。
在创建目录下新建gunicorn.conf.py

workers = 5    # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent"   # 采用gevent库,支持异步处理请求,提高吞吐量
bind = "0.0.0.0:8888"   #端口随便写,但是注意是否已经被占用。netstap -lntp

启动项目:

(venv) [root@localhost test]# gunicorn start:app -c gunicorn.conf.py
[2020-12-17 20:06:42 +0800] [91760] [INFO] Starting gunicorn 20.0.4
[2020-12-17 20:06:42 +0800] [91760] [INFO] Listening at: http://0.0.0.0:8888 (91760)
[2020-12-17 20:06:42 +0800] [91760] [INFO] Using worker: gevent
[2020-12-17 20:06:42 +0800] [91763] [INFO] Booting worker with pid: 91763
[2020-12-17 20:06:42 +0800] [91764] [INFO] Booting worker with pid: 91764
[2020-12-17 20:06:42 +0800] [91765] [INFO] Booting worker with pid: 91765
[2020-12-17 20:06:42 +0800] [91766] [INFO] Booting worker with pid: 91766
[2020-12-17 20:06:42 +0800] [91767] [INFO] Booting worker with pid: 91767

可以看到项目已经成功开启,且开了5个worker

3.在同目录下创建dockerfile文件

内容如下:

# 项目基于的python版本
FROM python:3.6
ADD start.py /home/www/test/
# 把test设置为工作目录
WORKDIR /home/www/test/
# 导入安装项目依赖包
COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
#安装依赖
COPY . .
# 端口8080 (可删除)
EXPOSE 8080
# 执行
# CMD ["python", "/home/www/test/app.py", "0.0.0.0"]
CMD ["gunicorn", "start:app", "-c", "./gunicorn.conf.py"]  #用于指定默认的容器主进程的启动命令
5.安装镜像
docker build -t 'docker-flask' .

安装成功如下:
在这里插入图片描述

6.检查是否安装成功
(venv) [root@localhost test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker-flask        latest              5b15d23b62a7        3 minutes ago       898MB
7.启动镜像
docker run -itd -p 8888:8888 docker-flask

8888端口则是新开的项目端口!把容器的8888端口映射到宿主机的8888端口,左边是宿主机监听端口,右边是容器监听端口。

查看已启动的镜像

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
d7bde2fe5abf        docker-flask        "python /home/www/te…"   About an hour ago   Up About an hour    0.0.0.0:5000->8080/tcp   interesting_wu

此时此刻你打开首页或者没有连接数据的页面的可以正常打开,比如打开登录页面是没问题了,一旦发起登录请求验证就出错了,这是由于数据库配置里面用的是localhost,这是因为你使用了以下方式启动docker会报无法连接数据库:

docker run -itd -p 8888:8888 docker-flask
错误信息:
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 101] Network is unreachable)")

这是由于用这种方式启动docker,内部是无法用访问宿主localhost,解决该问题就需要采用以下命令:

[root@iZrj94r5m6scq3q6h8weabZ /]# docker run --net=host -itd -p 8888:8888 docker-flask
WARNING: Published ports are discarded when using host network mode

其中–net=host表示启动容器可公用宿主机localhost

容器常用的操作命令

查到已经被停止的容器的id:

docker ps -a 

查看相应的日志信息:

docker logs id
  • 移除容器:
docker rm 容器ID
  • 开启镜像
docker start 镜像id
  • 停止镜像
docker stop 镜像id
  • 删除镜像
docker rmi 镜像id

关闭前可先查询镜像是否已经关闭,如果同一个镜像ID经过重命名产生多个时 不能直接删除镜像id,会错误:

[root@localhost ~]# docker rmi 5b15d23b62a7
Error response from daemon: conflict: unable to delete 5b15d23b62a7 (must be forced) - image is referenced in multiple repositories

解决方案:

docker rmi 镜像名称:tag

有时候会出现重启后有的容器不会自己重启需要手动重启,这显然不符合实际情况:

  • 找到想重启的容器
docker ps -a
docker start <CONTAINER ID>

优化解决方案,开机自启动:

  • 如果容器还处于未启动状态:
docker run --restart=always <CONTAINER ID>
  • 如果容器已经开启:
docker update --restart=always <CONTAINER ID>

这样即便系统重启也会自动启动对应容器!
参数介绍:

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]    
  
  -d, --detach=false         指定容器运行于前台还是后台,默认为false     
  -i, --interactive=false   打开STDIN,用于控制台交互    
  -t, --tty=false            分配tty设备,该可以支持终端登录,默认为false    
  -u, --user=""              指定容器的用户    
  -a, --attach=[]            登录容器(必须是以docker run -d启动的容器)  
  -w, --workdir=""           指定容器的工作目录   
  -c, --cpu-shares=0        设置容器CPU权重,在CPU共享场景使用    
  -e, --env=[]               指定环境变量,容器中可以使用该环境变量    
  -m, --memory=""            指定容器的内存上限    
  -P, --publish-all=false    指定容器暴露的端口    
  -p, --publish=[]           指定容器暴露的端口   
  -h, --hostname=""          指定容器的主机名    
  -v, --volume=[]            给容器挂载存储卷,挂载到容器的某个目录    
  --volumes-from=[]          给容器挂载其他容器上的卷,挂载到容器的某个目录  
  --cap-add=[]               添加权限,权限清单详见:http://linux.die.net/man/7/capabilities    
  --cap-drop=[]              删除权限,权限清单详见:http://linux.die.net/man/7/capabilities    
  --cidfile=""               运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法    
  --cpuset=""                设置容器可以使用哪些CPU,此参数可以用来容器独占CPU    
  --device=[]                添加主机设备给容器,相当于设备直通    
  --dns=[]                   指定容器的dns服务器    
  --dns-search=[]            指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件    
  --entrypoint=""            覆盖image的入口点    
  --env-file=[]              指定环境变量文件,文件格式为每行一个环境变量    
  --expose=[]                指定容器暴露的端口,即修改镜像的暴露端口    
  --link=[]                  指定容器间的关联,使用其他容器的IP、env等信息    
  --lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc时使用    
  --name=""                  指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字    
  --net="bridge"             容器网络设置:  
                                bridge 使用docker daemon指定的网桥       
                                host    //容器使用主机的网络    
                                container:NAME_or_ID  >//使用其他容器的网路,共享IP和PORT等网络资源    
                                none 容器使用自己的网络(类似--net=bridge),但是不进行配置   
  --privileged=false         指定容器是否为特权容器,特权容器拥有所有的capabilities    
  --restart="no"             指定容器停止后的重启策略:  
                                no:容器退出时不重启    
                                on-failure:容器故障退出(返回值非零)时重启   
                                always:容器退出时总是重启    
  --rm=false                 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)    
  --sig-proxy=true           设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

效果如下:
在这里插入图片描述

7.将镜像推送到docker
a.登陆

在ssh终端登陆docker hub账号。

docker login

输入自己注册的dockerID以及密码即可!

b.改名

用docker tag命令将本地的镜像名改成dockername/imagesname:tag格式。

docker tag docker-flask thomas/docker-flask:1.0
c.上传

将改好名字的镜像上传到docker hub上。
上传命令:

docker push dockername/flask-project:tagname

dockername: 注册的dockerID
flask-project: docker远程仓库名称
tagname: docker镜像的版本号

可以从docker后台查看push命令:
在这里插入图片描述

等待上传成功即可,如下图:
在这里插入图片描述

d.拉取
docker pull dockername/flask-project:tagname
8.镜像导出为文件

1.保存镜像为文件

docker save -o 要保存的文件名  要保存的镜像

实例:

[root@localhost ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
thomasalvin/flask-pro   1.0                 5b15d23b62a7        About an hour ago   898MB
<none>                  <none>              0863edd558a6        2 hours ago         874MB
python                  3.6                 4a03e5e8adde        37 hours ago        874MB
mysql                   5.7                 ae0658fdbad5        3 weeks ago         449MB
[root@localhost ~]# docker save -o docker-flask.tar thomasalvin/flask-pro:1.0
[root@localhost ~]# ls
docker-flask.tar

2.从文件载入镜像

docker load --input 文件

docker load < 文件

实例:

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

[root@localhost ~]# docker load < docker-flask.tar
Loaded image: thomasalvin/flask-pro:1.0

[root@localhost ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
thomasalvin/flask-pro   1.0                 5b15d23b62a7        About an hour ago   898MB
常见错误

安装镜像时出现以下错误:

WARNING: IPv4 forwarding is disabled. Networking will not work.

如下图:
在这里插入图片描述

解决方案:

vi /etc/sysctl.conf

需要做如下配置

net.ipv4.ip_forward=1  #添加这段代码
重启network服务
systemctl restart network && systemctl restart docker
查看是否修改成功 (备注:返回1,就是成功)
(venv) [root@localhost test]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
镜像需要挂载配置文件时

1.使用 -v 参数挂载容器卷:

docker run -d -p 8080:80 -v /path/to/host/file.yaml:/path/to/container/file.yaml:ro your_image_name

这个命令会运行一个 Docker 容器,并将宿主机上的 /path/to/host/file.yaml 文件挂载到容器内的 /path/to/container/file.yaml 路径,并设置为只读(read-only)。你需要将 /path/to/host/file.yaml 替换为宿主机上实际的文件路径,将 /path/to/container/file.yaml 替换为容器内实际需要访问的文件路径,your_image_name 替换为你的镜像名称。

2.使用 --mount 参数挂载容器卷:

docker run -d -p 8080:80 --mount type=bind,source=/path/to/host/file.yaml,target=/path/to/container/file.yaml,readonly your_image_name

这个命令也会将宿主机上的 /path/to/host/file.yaml 文件挂载到容器内的 /path/to/container/file.yaml 路径,并设置为只读。你同样需要将 /path/to/host/file.yaml 和 /path/to/container/file.yaml 替换为实际的文件路径,your_image_name 替换为你的镜像名称。

在以上的命令中,-d 参数表示在后台运行容器,-p 参数用于端口映射(如果需要),-v 或 --mount 参数用于挂载容器卷,readonly 表示设置为只读模式。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐