实测docker安装、打包镜像、上传到docker远程仓库
先决条件:在linux下实现安装好docker环境1.在centOS下部署一个简单的flask项目文件start.py,如下:项目目录:/home/www/testfrom flask import Flaskapp = Flask(__name__)@app.route('/')def test():return 'This is Flask!'if __name__ == '__main__'
先决条件:
在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 表示设置为只读模式。
更多推荐
所有评论(0)