docker 学习笔记

本贴最后更新于 1416 天前,其中的信息可能已经斗转星移

docker 安装文档

--

1. ubuntu 安装 docker

安装命令:

  • ###Docker 的旧版本被称为 docker,docker.io 或 docker-engine 。如果已安装,请卸载它们:

    sudo apt-get remove docker docker-engine docker.io containerd runc  
    
  • ###apt 依赖包

    sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
    
  • ####添加 Docker 的官方 GPG 密钥

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
  • 1.设置稳定版本

    sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
    
  • 1.1 这里可能出先 sourcelist 的错误,解决办法把 source.list 中的 docker 修改如下

    deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable
    
  • 1.2 更新 apt 并安装最新的 docker;同时测试是否安装成功
    sudo apt-get update
    sudo apt-get install docker-ce docker-ce-cli containerd.io
    sudo docker run hello-world

  • 1.3 镜像加速 Ubuntu16.04+、Debian8+、CentOS7

    对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):

    {"registry-mirrors":["https://registry.docker-cn.com"]}   
    重启docker服务
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  • 1.4 添加当前用户到 docker 用户组,可以不用 sudo 运行 docker(可选)

    
    Ubuntu16.04 添加 Docker用户组
    
    将用户添加到docker用户组就不用每次都 sudo了。
    
    ### 首先创建用户组
    
    sudo groupadd docker
    
    将用户加如组
    
    sudo gpasswd -a ${USER} docker
    
    重启服务
    
    sudo service docker restart
    
    切换当前会话到新组
    
    newgrp - docker
    
    
  • 1.5 测试添加用户组(可选)
    docker run hello-world

  • 1.6 设置开机启动

    sudo systemctl enable docker
    sudo systemctl start docker
    

docker 容器常用操作命令

  • 2.1 使用镜像启动一个容器

    docker run ubuntu:16.04 /bin/echo "sunbing nihao"
    
  • 2.2 docker 后台启动

    
    
  • 2.3 docker 交互式
    docker run -i -t ubuntu:15.10 /bin/bash

  • 2.4 查看标准输出和容器列表
    docker logs 容器名称或者id
    docker ps

  • 2.5 容器命令

     docker start/stop b750bbbcfd88 
     docker run -itd --name ubuntu-test ubuntu /bin/bash 后台启动
    
     在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
     docker attach 退出容器是会关闭
     docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
    
     docker exec -i -t 243c32535da7 /bin/bash
    
     导出本地容器:docker export 1e560fca3906 > ubuntu.tar
     导入容器快照:可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
         方式一:$cat docker/ubuntu.tar | docker import - test/ubuntu:v1
         方式二:此外,也可以通过指定 URL 或者某个目录来导入,例如:
             $docker import http://example.com/exampleimage.tgz example/imagerepo
     删除容器:docker rm -f 1e560fca3906、
     清理所有终止容器:docker container prune 
     根据网络端口查看:docker port id/name  
     查看容器内部的程序进程:docker top id/name
     查询最后一次创建的容器:docker ps -l 
    
  • 2.6 容器启动 flask 应用程序并映射容器端口到本地端口

     后台启动将内部容器端口映射到主机上 -P默认端口
     docker run -d -P training/webapp python app.py
     后台启动映射到主机指定端口
     docker run -d -p 5000:5000 training/webapp python app.py
    
  • 2.7 宿主机和容器之间的交互操作

    复制、移动文件操作  
    1.宿主机到容器  
    docker cp 本地路径   容器:容器内部路径  
    2.容器到宿主机  
    docker cp 容器:容器内部路径 本地路径  
    3. 不管容器是否启动复制操作都会生效  
    

docker 镜像操作

   1.查找镜像 docker search nginx  
   2.拉取镜像 docker pull imagname
   3.删除镜像 docker rmi imagename
       1>从从已有的镜像中更新镜像,并提交镜像
        2>使用dockfile文件重新创建一个镜像
  
    4.1 dockerfile 文件格式指明了镜像源 以及容器内运行的相关命令,安装的相关的软件  

    FROM centos:6.7
    MAINTAINER      Fisher "fisher@sudops.com"
  
    RUN     /bin/echo 'root:123456' |chpasswd
    RUN     useradd sunbing
    RUN     /bin/echo 'sunbing:123456' |chpasswd
    RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
    EXPOSE  22
    EXPOSE  80
    CMD     /usr/sbin/sshd -D  

    4.2启动新创建的容器 docker build -t runoob/centos:6.7 Dockerfile 所在路径
    4.3 为容器制定标签 docker tag 860c279d2fec runoob/centos:dev
    4.4 将宿主机的目录挂载到容器里面  docker run -it -v test:/bing ubuntu:16.04 /bin/bash


docker 搭建 docker hub 远程仓库


docker 构建本地私有仓库

1.创建一个 docke 仓库 docker_registry 在 docker_registry 目录下下载 registry 镜像 docker pull registry
2.默认情况下,会将仓库存放于容器内的/var/lib/registry 目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录(刚刚创建的/home/docker_registry)挂载到容器内的/var/lib/registry 下,如下:

docker run -d -p 5000:5000 -v /home/docker_registry:/var/lib/registry registry

3.镜像标记
docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY
docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest
4.容器内部更改之后打包成新的镜像
docker commit container_id 名称
eg:docker commit 1nfiji90 kaldi/ubuntu:v1
5.推送容器到私有仓库 dock push ..
6.通过 root 账号启动容器进行各种安装 安装之前要更新原始的安装源

apt-get update  
docker exec -u 0 -it 623698865ff7(容器id) bash

docker 容器内部更改 apt 国内镜像源

    备份原始文件
    mv /etc/apt/sources.list /etc/apt/sources.list.bak
    重新写入镜像源
    ehco ""<<sources.list
  
    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    ##测试版源
    deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
    # 源码
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    ##测试版源
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
    # Canonical 合作伙伴和附加
    deb http://archive.canonical.com/ubuntu/ xenial partner
    deb http://extras.ubuntu.com/ubuntu/ xenial main
    #更新安装源
    apt-get update 

--

docker 私有仓库镜像使用问题集锦

1. 其他机器拉取时失败问题
现象:把harbor端口默认的80端口修改为1180,然后打了个测试镜像上去,但是在test102机器pull镜像的时候失败了,报错如下:
Get https://10.0.0.101/v1/_ping: dial tcp 10.0.0.101:443: getsockopt: connection refused
解决办法:在另一台机器上的docker的配置文件没有修改,于是在 /etc/docker/daemon.json 加上了“--insecure-registry=10.0.0.101:1180”
注意:重启配置文件和docker (systemctl daemon-reload) 先后执行(systemctl retart docker)
2. 进入容器之后拉取代码显示无解析主机
现象:fatal: unable to access 'https://e.coding.net/sunboy_magic/help_accept.git/': Could not resolve host: e.coding.net
解决办法:首先:ping host 其次在/etc/hosts 文件中加入一行 ip host  例如:118.126.70.252    e.coding.net
3. 端口443 问题
现象:fatal: unable to access 'https://e.coding.net/sunboy_magic/help_accept.git/': Failed to connect to e.coding.net port 443: No route to host
解决办法:启动时指定--host参数,目的是容器使用宿主机器的端口,进行通信,可以解决各种端口问题,非常暴力。
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    492 引用 • 926 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...