docker
docker安装
1.卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
2.设置存储库
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3.安装docker社区版
sudo yum install docker-ce
4.启动关闭docker
systemctl status/start/stop docker #看状态/启动/停止
DaoCloud 加速器 是广受欢迎的 Docker 工具,解决了国内用户访问 Docker Hub 缓慢的问题。DaoCloud 加速器结合国内的 CDN 服务与协议层优化,成倍的提升了下载速度。
一键命令:curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
然后重启:systemctl restart docker
容器三大基本概念
镜像 image
Docker镜像就是一个只读的模板。镜像可以用来创建Docker容器。
docker是把应用程序和其依赖打包在image文件里面,只有通过这个镜像文件才能生成docker容器。
一个image文件可以生成多个容器实例。
容器 container
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
仓库 repository
仓库是集中存放镜像文件的场所。有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。
docker命令
从docker registry获取镜像的命令是docker pull。命令格式是:
docker pull [选项][docker registry地址] 仓库名:标签
docker register地址:地址的格式一般是 域名:端口,默认地址是docker hub
仓库名:仓库名是两段格式,用户名/软件名,如果不写用户,默认docker hub用户名是library,也就是官方镜像
下载镜像创建实例
docker pull 镜像文件名 #下载docker镜像
docker run hello-world
运行镜像文件,生成docker容器实例,会自动下载不存在的镜像
容器是随时创建,随时删除的,轻量级,每次docker run 都会生成新的容器记录
docker容器进程,如果没有在后台运行的话,就会立即挂掉, (容器中必须有正在工作的进程)
运行一个活着的容器进程
docker run -d centos /bin/sh -c "while true;do echo 'hello'; sleep 1;done"
- -d 后台运行的意思
- centos 指的是镜像文件名
- /bin/sh 要在这个容器内运行的命令,指定的解释器 shell解释器
- -c 指定一段shell代码
进入容器空间内的命令
docker exec -it 容器id /bin/bash
#进入一个活着的容器空间内
-i 交互式命令操作
-t 开启一个新的终端
运行一个centos容器
docker run -it centos
默认会进入容器空间内
查
docker search 镜像文件名字 #搜索镜像文件
docker images #列出当前所有的镜像文件
docker ps #列出当前记录正在运行的容器进程
docker ps -a #列出所有的容器进程,以及挂掉的
docker logs 容器id #查看容器内的日志信息
docker logs -f 容器id #实时查看容器内的日志
删
docker rmi 镜像名字/镜像id #删除镜像文件
docker rmi -f #强制删除镜像文件
docker rm 容器id/容器进程名字 #删除容器记录
docker rm `docker ps -aq` #批量删除容器记录
改
#docker容器进程的启停命令
docker start 容器id
docker stop 容器id
镜像制作导出导入
镜像制作导出导入
运行出容器实例=> 二次修改容器实例=> 提交容器实例为新的镜像=>导出镜像 =>发给别人导入
docker run -it centos /bin/bash
yum install vim
docker commit 059 yhp/centos-vim #提交这个容器,创建新的image
docker save yhp/centos-vim > /opt/centos.tar.gz #导出docker镜像至本地
docker load < /opt/centos.tar.gz #导入本地镜像到docker镜像库
端口映射
docker run -d -P
-d 后台运行
-P 随机端口映射 随机的宿主机的端口:容器内的端口(自动指定的,由代码指定)
-p 指定端口映射 宿主机的9000:5000(小写p)
1.下载一个flask的docker镜像
docker pull training/webapp
2.端口映射
docker run -d -P training/webapp python app.py #创建一个容器空间,然后在里面执行 python app.py 命令
docker run -d -p 9000:5000 training/webapp python app.py #创建一个容器空间,然后在里面执行 python app.py 命令
3.访问这个容器应用
服务器ip:宿主机的映射端口
127.0.0.1:9000
查看指定容器的端口映射
docker port c0b
5000/tcp -> 0.0.0.0:9000
查看容器内的进程
UID PID PPID C STIME TIME CMD
root 3926 3912 0 16:46 00:00:00 python app.py
Dockerfile
镜像的定制就是定制每一层所添加的配置、文件。如果可以每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
1.FROM指令用于 指定容器用什么发行版
FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
FROM centos #使用base image
FROM ubuntu:14.04 #带有tag的base image
2.定义标签变量的
LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
LABEL maintainer=“yhp@163.com"
3.万能RUN指令,让容器自己去做些什么事
对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
RUN yum update && yum install -y vim \
Python-dev #反斜线换行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”
RUN yum install redis #自动安装redis
4.WORKDIR
WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
WORKDIR /test #如果没有就自动创建
WORKDIR demo #再进入demo文件夹
RUN pwd #打印结果应该是/test/demo
WORKDIR /opt
WORKDIR /tmp
WORKDIR ../
5.ADD COPY将宿主机的文件添加到容器空间内
ADD存在压缩文件解压的功能,因此,仅仅添加文件到容器内,用COPY而不是ADD
ADD hello / #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录
ADD test.tar.gz / #添加到根目录并解压
WORKDIR /root
ADD hello test/ #进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径
COPY hello test/ #等同于上述ADD效果
ADD与COPY
- 优先使用COPY命令
-ADD除了COPY功能还有解压功能
添加远程文件/目录使用curl或wget
6.环境变量
ENV #环境变量,尽可能使用ENV增加可维护性
ENV MYSQL_VERSION 5.6 #设置一个mysql常量
RUN yum install -y mysql-server=“${MYSQL_VERSION}”
7.CMD
容器启动时默认执行的命令
如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略
如果定义多个CMD,只有最后一个执行
dockerfile构建一个flask web app
-
flask_demo.py
#coding:utf8 from flask import Flask app=Flask(__name__) @app.route('/') def hello(): return "hello docker" if __name__=="__main__": app.run(host='0.0.0.0',port=8080)
-
准备Dockerfile (名字必须叫做 Dockerfile)
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 flask_demo.py /opt/ WORKDIR /opt EXPOSE 8080 CMD ["python","flask_demo.py"]
在Dockerfile同级目录,准备好其他环境文件,代码文件
CentOS-Base.repo Dockerfile epel.repo flask_demo.py
-
构建docker镜像
docker build -t yhp/flask_demo-docker .
docker build 编译Dockerfile
-t 给镜像加上名字 ,镜像名字,以仓库地址开头,则可以推送到仓库中管理
. 找到当前的Dockefile文件
-
构建完毕之后,查看镜像文件
docker images
-
运行这个flask镜像文件,生成容器实例,代码就跑在容器中了
docker run -d -p 5000:8080 yhp/flask_demo-docker
发布docker image到仓库registry
推送本地镜像到dockerhub
-
登录docker账户
docker提供了一个类似于github的仓库dockerhub,网址https://hub.docker.com/需要注册使用。注册docker id后,在linux中登录dockerhub。
docker login
-
修改docker镜像文件名字,以docker hub账号开头
docker tag docker.io/hello-world yinhaiping105/my_hello
-
推送镜像到dockerhub仓库中,(注意这个是公共仓库)
docker push yinhaiping105/my_hello
私有仓库
-
下载私有仓库镜像文件
docker run -d \ -p 5000:5000 \ -v /opt/data/registry:/var/lib/registry \ registry
私有仓库会被创建在容器的/var/lib/registry下,因此通过-v参数将镜像文件存储到宿主的/opt/data/registry下
端口映射容器中的5000端口到宿主机的5000端口
-
修改docker的配置文件,支持推送非https的私有镜像
vim /etc/docker/daemon.json 在字典中添加"insecure-registries":["192.168.182.130:5000"] [root@yhp win]# cat /etc/docker/daemon.json {"registry-mirrors": ["http://95822026.m.daocloud.io"], "insecure-registries":["192.168.182.130:5000"]}
-
修改docker的启动文件,加载第二步,修改的配置文件
vim /lib/systemd/system/docker.service #找到如下的[Service] 代码块,添加参数 [Service] EnvironmentFile= -/etc/docker/daemon.json
-
重新加载配置,重启docker,重启registry
systemctl daemon-reload systemctl restart docker docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry --privileged=true docker容器的安全机制:设置特权级运行的容器
-
推送本地镜像
docker push 192.168.119.10:5000/hello-world
[root@yhp win]# docker push 104.199.159.34:5000/my_hello Using default tag: latest The push refers to repository [104.199.159.34:5000/my_hello] 2653d992f4ef: Pushed
API查看地址:
http://104.199.159.34:5000/v2/_catalog
,是一个json。[root@yhp win]# curl http://104.199.159.34:5000/v2/_catalog {"repositories":["my_hello"]}
-
下载镜像
[root@yhp win]# docker pull 104.199.159.34:5000/my_hello Using default tag: latest latest: Pulling from my_hello Digest: sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875 Status: Image is up to date for 104.199.159.34:5000/my_hello:latest 104.199.159.34:5000/my_hello:latest