经过一条命令,运行一个python web容器。
docker run -d -P trainging/webapp python app.py -d 后台运行参数 -P 随机端口映射,宿主机的一个随机端口:映射到容器内暴露的端口 trainging/webapp 运行的镜像名 python app.py 运行容器内的一个app.py脚本文件
镜像是容器的基础,每次执行docker run的时候都会指定哪一个镜像做为容器运行的基础。直接使用来自docker hub的镜像只能知足必定的需求,当镜像没法知足咱们的需求时,须要自定制镜像。python
镜像的定制就是定制每一层所添加的配置、文件。若是能够把每一层修改、安装、构建、操做的命令都写入到一个脚本中,用脚原本构建、定制镜像,这个脚本就是dockerfile。dockerfile是一个文本文件,其内容是一条条的指令,每一条指令构建一层,所以每一条指令的内容就是描述该层如何构建的。mysql
# FROM指令是指定哪个系统做为基础镜像 # 制做base image基础镜像,尽可能使用官方的image做为base image FROM centos FROM ubuntu:14:04 # 带有tag的base image # 容器元信息,帮助信息,相似于代码注释 LABEL version="1.0" LABEL maintainer="user" # RUN这个指令是万能指令,写什么,docker构建时就执行什么 # 对于复杂的RUN指令,避免无用的分层,多条命令用反斜线换行,合成一条命令 RUN yum update && yum install -y vim \ Python-dev # 反斜线换行 RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME" WORKDIR /root # 至关于linux的cd命令,改变目录,尽可能使用绝对路径 WORKDIR /test # 若是没有就自动建立 WORKDIR demo # 再进入demo文件夹 RUN pwd # 打印结果应该是/test/demo ADD hello / # 把本地文件添加到镜像中,把本地的hello可执行文件拷贝到镜像的/目录 ADD test.tar.gz # ADD指令不只有拷贝资料到容器的做用,还有解压的做用 COPY hello test/ # 等同于上述ADD效果 # ADD与COPY # - 优先使用COPY命令 # - ADD除了COPY功能还有解压功能 # 添加远程文件/目录使用curl或wget # ENV指令用于定义一个变量 ENV # 环境变量,尽量使用ENV来增长可维护性 ENV MYSQL_VERSION 5.6 # 设置一个mysql常量 RUN yum install -y mysql-server="${MYSQL_VERSION}" # 例子 ENV django_version="1.5" pip3 install django==django_version # dockerfile的expose参数,暴露容器的8080端口,提供给外部机器访问 EXPOSE 8080
构建一个dockerfile与flask web应用,且外部客户端能够访问。linux
建立一个flask代码文件web
#coding:utf8 from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return "<h1>这是一个dockerfile构建的flask web应用</h1>" if __name_ == "__main__": app.run(host='0.0.0.0', port=8080)
建立dockerfile,内容以下sql
FROM centos COPY Centos-Base.repo /etc/yum.repos.d/ COPY epel.repo /etc/yum.repos.d/ RUN yum clean all RUN yum install python-setuptools -y RUN easy_install flask COPY s16-flask.py /opt/ WROKDIR /opt EXPOSE 8080 CMD ["python", "s16-flask.py"]
构建打包dockerfile,生成一个本身的镜像docker
docker build -t yuchao163/s16-flask-docker . -t 指定镜像的版本名 。 找到当前路径的Dockerfile
基于这个本身构建的镜像,运行一个flask web容器django
docker run -d -p 8888:8080 77b -d 后台运行 -p 指定端口映射 宿主机的8888映射到容器的8080 77b 本身构建的镜像id
查看容器的端口转发状况json
docker port 容器id
docker私有仓库的搭建flask
下载一个私有仓库的镜像,基于这个镜像生成docker仓库容器ubuntu
docker run -d \ -p 5000:5000 \ -v /opt/data/registry:/var/lib/registry \ registry # 参数解释 -v 数据卷挂载,目录映射 -p 端口映射
修改docker的配置文件,支持http方式的推送
vim /etc/docker/daemon.json # 修改以下参数 {"registry-mirrrors":["http://f1361db2.m.daocloud.io"], "insecure-registries":["宿主机IP:5000"] }
修改docker的启动服务命令,支持读取/etc/docker/deamon.json
文件
# 编辑文件 /lib/systemd/system/docker.service vim /lib/systemd/system/docker.service # 找到[service]这一行,添加以下参数 EnvironmentFile=-/etc/docker/daemon.json
从新读取docker配置文件
systemctl daemon-reload
重启docker服务
systemctl restart docker
因为重启了我docker,docker进程都挂掉了
# 从新运行一个新的私有仓库,命令以下 docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry --privileged=true docker容器的安全机制:设置特权级运行的容器
推送本地镜像到私有仓库中
1. 修改本地镜像的tag标记号,指定私有仓库的地址传输 docker tag docker.io/hello-world 宿主机IP:端口/s16-old-docker 2. 推送到私有仓库 docker push 宿主机IP:端口/s16-old-docker
经过私有仓库的api,检查镜像数据
能够经过浏览器访问api数据,http://192.168.15.71:5000/v2/_catalog
此时能够经过私有仓库下载公司内部的镜像
docker pull 宿主机IP:端口/s16-old-docker-heheheheh