在linux下实现安装好docker环境
yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
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
元数据缓存已建立
# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker
以上就完成了docker的安装!
https://hub.docker.com/
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
https://registry.docker-cn.com
http://hub-mirror.c.163.com
https://docker.mirrors.ustc.edu.cn
项目目录:/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)
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
内容如下:
# 项目基于的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"] #用于指定默认的容器主进程的启动命令
docker build -t 'docker-flask' .
(venv) [root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-flask latest 5b15d23b62a7 3 minutes ago 898MB
docker run -itd -p 8888:8888 docker-flask
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
查看全部容器
查到已经被停止的容器的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
参数介绍:
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不能被代理
在ssh终端登陆docker hub账号。
docker login
输入自己注册的dockerID以及密码即可!
用docker tag命令将本地的镜像名改成dockername/imagesname:tag格式。
docker tag docker-flask thomas/docker-flask:1.0
将改好名字的镜像上传到docker hub上。
上传命令:
docker push dockername/flask-project:tagname
dockername: 注册的dockerID
flask-project: docker远程仓库名称
tagname: docker镜像的版本号
docker pull dockername/flask-project:tagname
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 #添加这段代码
systemctl restart network && systemctl restart docker
(venv) [root@localhost test]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1