docker基础

0. 仓库:
1. 镜像:
2. 容器:
---------------------------
    docker  vs   vmware
---------------------------

一.镜像相关命令:
    1. Usage: docker search 名字   //搜索镜像
        例如:  docker search centos7
        
    2. Usage: docker pull  镜像名:tag  //下载镜像
        例如: docker pull centos7

    3. Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]  //更改镜像名:标签名
        例如: docker tag docker.io/nickistre/centos-lamp:latest lamp:lamp

    4. Usage: docker save oldIMAGE [OPTIONS] newIMAGE //将镜像导出到本地
        例如: docker save docker.io/nickistre/centos-lamp  -o lamp01
        
    5. Usage: docker load -i 镜像名   //将加载本地镜像文件
        例如: docker load -i  lamp03    

    6. docker images  //查看所有已经下载的镜像
    
    7. docker inspect 镜像ID  //查看指定镜像的相关信息
    
    8. docker rmi 镜像ID|镜像名   //删除镜像名
    
保存和加载:
    docker save ...
    docker load ...
    
二.容器相关命令:
    1. Usage: docker ps -a  //查看所有容器
    
    2. Usage: docker ps   //查看正在运行的容器
    
    3. Usage: docker rm 容器ID|容器名  //删除容器
    
    4. Usage: docker create -it 镜像名|镜像ID /bin/bash  //通过指定镜像名创建容器
        [root@Docker images]# docker create -it 57d8c48a14b1 /bin/bash
        56606f50d1d09d1050e9cb6c51af5d7751daf53c15d65b01f016a11d6a9a3b24
        [root@Docker images]# docker ps -a
        CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
        56606f50d1d0        57d8c48a14b1        "/bin/bash"         6 seconds ago       Created                                 jovial_murdock
        [root@Docker images]# 

    5. Usage: docker start|stop 容器ID|容器名  //打开|停止容器
    
    6. Usage: docker export  old容器ID|old容器名 -o newContainer  //将容器导出到文件
        例如: docker export  05af39e8b263 -o newContainer  //将容器05af39e8b263导出为文件newContainer
        
    7. Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] //将容器导入变成一个镜像
        例如: docker import newContainer //将本地的之前导出的文件newContainer变成一个镜像
导入和导出:
    docker import ...
    docker export ...
    
三. 运行和管理容器
    
    1. Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]   //进入到容器,需要提前开启容器
        例如: docker exec -it 56606f50d1d0 /bin/bash
        
    2. Usage: docker run -itd 镜像ID|镜像名 /bin/bash
        例如: docker run -itd -p 12345:80 httpd:latest /bin/bash  //通过镜像httpd生成容器,并指定本地12345端口映射到容器80端口
    
    3. Usage: docker run -d -v /data01:/data01 -v /data02:/data02 --name web httpd:centos  //创建一个名为web的容器,在宿主主机创建数据卷/data01和/data02,分别挂载到容器里面,并与宿主机的/data01,/data02关联

    4. 根据镜像docker.io/centos创建一个打开的容器web005
       Usage: docker run -itd --name web005 docker.io/centos /bin/bash  //容器名为web005,后台运行web005
       Usage: docker run -it --name web005 docker.io/centos /bin/bash  //容器名为web005,前台运行web005    
       
    5. 容器间共享数据
       Usage: docker run -it --volumes-from web --name db01 httpd:latest    //web为源容器,db01为生成容器
       
    6. 端口映射
       Usage: docker run -d -P httpd:latest  //docker随机映射一个端口范围49000-49900的端口到容器内部开发的网络端口
       
       Usage: docker run -d -p 49888:80 httpd:latest  //docker指定端口映射

    7. 容器互联--通过容器的名称在容器间建立一条专门的网络通信隧道,
       在源容器和接收容器之间建立一条隧道,接收容器看到源容器指定的信息
       docker run --link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,
       并且接收容器可以获取源容器的一些数据,如源容器的环境变量
           --link的格式:
           --link <name or id>:alias
           其中,name和id是源容器的name和id,alias是源容器在link下的别名。
       Usage: 
                7.1 docker run -d -P --name source_web01 httpd:latest  //创建源容器
                7.2 docker run -d -P --name destination_web02 --link source_web01 httpd:latest //创建容器并链接到源容器
                
    8. 创建一个新的 Docker 网络。
     docker network create -d bridge test-net  #网络名称为test-net
     docker run -itd --name test1 --network test-net ubuntu /bin/bash  #为指定创建的容器指定网络
     
    9.在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS:

        {
          "dns" : [
            "114.114.114.114",
            "8.8.8.8"
          ]
        }
        设置后,启动容器的 DNS 会自动配置为 114.114.114.1148.8.8.8。
        配置完,需要重启 docker 才能生效。
        
    10.在指定的容器设置 DNS,则可以使用以下命令:
        docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu
        
            --rm:容器退出时自动清理容器内部的文件系统。
            -h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。
            --dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
            --dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。        
            如果在容器启动时没有指定 --dns 和 --dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS        
    12. 创建一个名称为web99,容器的主机名为vm_web1,容器的dns指向114.114.114.114;容器退出时自动清理容器内部的文件系统
    docker run -it --name web99 -h vm_web1 --dns 114.114.114.114 --rm  lamp  /bin/bash

        
        

四. docker镜像创建方法
         基于已有运行的容器创建: 
         基于本地模板创建
         基于Dockerfile创建

     1. 基于已有运行的容器创建<docker commit ...>: 把一个容器里面运行的程序及其运行环境打包生成新的镜像
        Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
                Create a new image from a container's changes
        例如: docker commit  --help //查看命令帮助
        [root@Docker ~]# docker commit -a "vmsysjack" -m "Hello,Everyone" -p  56606f50d1d0 vm1:vm2 //将容器56606f50d1d0打包成为一个镜像,名称为vm1,tag为vm2
        

    2. 基于本地模板创建:
        2.1. 从网上下载模板
        2.2. cat 模板文件 | docker import - 镜像名:tag名
    
    3. 基于Dockerfile创建: 使用dockerfile自动生成镜像,dockerfile由一组指令组成的文件
          
                       1.基础镜像信息 
          dockerfile   2.维护者信息
           组成部分       3.镜像操作指令
                       4.容器启动时执行指令
                       
        vim dockerfile
        
    使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,
    其中包含一组指令来告诉 Docker 如何构建我们的镜像。    
    
    开始构建:
     docker build  -t hello:latest .  #在dockerfile文件目录下构建镜像文件
        -t :指定要创建的目标镜像名
        .  :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
    
-------------------------------
#第一行必须指明基于的基础镜像
FROM centos
#维护该镜像的用户信息
MAINTAINER The Centos Project
#镜像操作指令
RUN yum -y update
RUN yum install -y openssl-server
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#开启22端口
EXPOSE 22
#启动容器时执行指令
CMD ["/usr/sbin/sshd","-D"]
--------------------------------
命令解释:
    from镜像:    指定新镜像所基于的镜像,每创建一个镜像就需要一条FROM指令
    
    maintainer名字:    说明新镜像的维护人信息
    
    run命令:    在所基于的镜像上执行命令,并提交到新的镜像中
    
    cmd["要运行的程序","参数1","参数2"]: 指令启动容器时要运行的命令或者脚本,dockerfile只能有一条CMD命令,指定多条则只能最后一条被执行
    
    expose端口号:    指定镜像加载到docker时要开启的端口
    
    ENV环境变量变量值:     设定一个环境变量的值,会被后面的RUN使用
    
    add 源文件  /目录目标文件/目录:     将源文件复制到目标文件,源文件要与dockerfile位于相同目录中,或者是一个URL
    
    copy 源文件 /目录目标文件/目录:     将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
    
    volume["目录"]:     在容器中创建一个挂载点
    
    user 用户名/uid:     指定运行容器时的用户
    
    workdir 路径:    为后续的RUN,CMD,ENTRYPOINT指定工作目录
        例如: workdir /root/nginx  进入到真实机/root/nginx
    
    onbuild 命令:    指定所生成的镜像作为一个基础镜像时所要运行的命令
    
############################################################################################
    
注意:
    add run.sh  /run.sh
    cmd [ "/run.sh" ]
    -----------------------------------
    cmd [ "/usr/sbin/init" ]  #表示在启动容器的时候自动加载/usr/lib/systemd/system/下的脚本文件
    当使用cmd ["/usr/sbin/init" ]来加载配置文件后,再次使用docker run -it ... /bin/bash时,
    容器不能够使用systemctl命令,只能够使用docker run -d ....
    -----------------------------------
    docker run -itd --privilged=true nginx:centos init /bin/bash (X)
    
    --------------------------
    
############################################################################################
    
    
    
    
    
    
原文地址:https://www.cnblogs.com/vmsysjack/p/14198810.html