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

  1. 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)
    
  2. 准备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

  3. 构建docker镜像

    docker build -t yhp/flask_demo-docker .

    docker build 编译Dockerfile

    -t 给镜像加上名字 ,镜像名字,以仓库地址开头,则可以推送到仓库中管理

    . 找到当前的Dockefile文件

  4. 构建完毕之后,查看镜像文件

    docker images

  5. 运行这个flask镜像文件,生成容器实例,代码就跑在容器中了
    docker run -d -p 5000:8080 yhp/flask_demo-docker

发布docker image到仓库registry

推送本地镜像到dockerhub

  1. 登录docker账户

    docker提供了一个类似于github的仓库dockerhub,网址https://hub.docker.com/需要注册使用。注册docker id后,在linux中登录dockerhub。

    docker login

  2. 修改docker镜像文件名字,以docker hub账号开头

    docker tag docker.io/hello-world yinhaiping105/my_hello

  3. 推送镜像到dockerhub仓库中,(注意这个是公共仓库)

    docker push yinhaiping105/my_hello

私有仓库

  1. 下载私有仓库镜像文件

    docker run -d 
        -p 5000:5000 
        -v /opt/data/registry:/var/lib/registry 
        registry
    

    私有仓库会被创建在容器的/var/lib/registry下,因此通过-v参数将镜像文件存储到宿主的/opt/data/registry下

    端口映射容器中的5000端口到宿主机的5000端口

  2. 修改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"]}
    
  3. 修改docker的启动文件,加载第二步,修改的配置文件

    vim /lib/systemd/system/docker.service  #找到如下的[Service]  代码块,添加参数
    
    [Service]
    EnvironmentFile= -/etc/docker/daemon.json 
    
  4. 重新加载配置,重启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容器的安全机制:设置特权级运行的容器
    
  5. 推送本地镜像

    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"]}
    
  6. 下载镜像

    [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
    
原文地址:https://www.cnblogs.com/yinhaiping/p/14153046.html