docker 学习实践笔记整理


目录:

什么是docker? docker 能解决什么问题?

Docker 是一个开源的平台用来 开发、部署和运行我们的应用程序。Docker 可以帮助我们将应用程序和底层基础设施进行分离,以帮助我们更快的实现交付Docker 可以让开发者在构建应用时,将应用与其依赖的环境一起打包到一个可移植的容器中,而不影响主机环境。相当于在主机中虚拟出一个机器,类似我们安装的虚拟机。

docker 的架构图

image.png
docker 主要由上面三部分构成,client 使用docker 命令和docker daemon 守护进程来进行交互,register 是存储docker 镜像的地方,可以有docker 官方的仓库,自己搭建的仓库,等等。

  • docker 镜像可以理解为存于磁盘上面可以通过特定方式执行的静态文件,可以类比传统虚拟机中的 ISO 文件。(Docker 镜像是可以被 Docker Daemon 识别并执行的特定文件)。
  • docker 容器是镜像的一个运行实例。

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 "sunboy nihao"
  • 2.2 docker 后台启动 记得加参数 -d
  • 2.3 docker 交互式
    docker run -i -t ubuntu:15.10 /bin/bash
  • 2.4 查看标准输出和容器列表
    docker logs 容器名称或者id
    docker ps
  • 2.5 容器命令
#后台启动容器
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 容器:容器内部路径 本地路径  
#不管容器是否启动复制操作都会生效

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 sunboy
RUN     /bin/echo 'sunboy: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参数,目的是容器使用宿主机器的端口,进行通信,可以解决各种端口问题,非常暴力。