重点
- docker中镜像是静态数据
- 通过docker run等类似命令从镜像创建一个容器, 容器是动态的数据,所有对容器的修改,不会影响创建容器的镜像. 一个镜像可以创建多个容器
因为工作需要学习了一下docker的使用方法,记录在此.
安装
目前docker只支持linux下,而且也要是比较新的版本,比如ubuntu只有14.04和16.04支持.下面是16.04下的安装步骤
- 安装必要的系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
- 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
- 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
- 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
- 安装校验
docker version
下载镜像
下面的命令利用docker在Ubuntu:16.04镜像内执行一个echo语句,如果本地没有ubuntu:16.04,会自动下载.
docker run ubuntu:16.04 /bin/echo "just tt"
但是因为GFW的原因,一般是下载失败的,可以先执行如下命令,设置加速器
docker pull registry.docker-cn.com/library/ubuntu:16.04
另一个加速的方法是注册DaoCloud,注册后会给个一命令,执行后重启docker服务,docker pull的速度会提高
运行docker
docker中镜像是静态的,镜像运行起来后就是容器,容器是动态的.
交互式运行docker
docker run -i -t ubuntu:16.04 /bin/bash
执行这条命令后,会使用镜像ubuntu:16.04创建一个容器,用户会进入这个容器,使用exit命令退出容器.
后台运行docker
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
上面的命令利用镜像ubuntu:15.10创建一个容器,并执行一个shell循环. 这个命令会返回一个长字符串,叫做容器ID,唯一标识一个容器.
docker ps
查看所有运行中的容器
docker logs docker-id
docker-id就是那一长串字符(前面几位即可),该命令会显示容器的标准输出的内容
docker stop docker-id
停止后台运行的docker
docker 启动时增扩硬盘
docker -d --storage-opt dm.basesize=20G
docker 如何联网
docker默认的ubuntu镜像没有ifconfig和ping命令,在容器内执行如下命令即可
apt-get update
apt install net-tools
apt install iputils-ping
docker容器管理
- docker run: 创建并启动一个容器
有几个重启选项
–restart=always: 不管容器返回码是什么, 都会重启容器
–restart=on-failure:5 当容器返回值非零时才会重启容器 - docker run -dit 192.168.1.10:5000/testpc:ver1: 后台方式启动一个镜像
- docker ps -a: 查看所有容器,包括停止的
- docker start A: 启动之前已经停止的容器A
- docker stop: 推出容器
- docker kill: 强制停止一个容器
- docker rm: 删除已经停止的容器
- docker cp: 在本地和docker之间复制文件
- docker attach: 重新链接一个后台运行容器
退出容器时,用ctrl-D会结束容器,用ctrl-P ctrl-Q退出但不结束容器
搭建docker私有库
docker pull registry
registry也是一个特殊容器,保留字docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 –restart=always –name registry registry
启动registry容器, 端口5000, 默认目录/var/lib/registry映射到本机的/opt/registry目录 (无认证启动registry容器)docker commit 容器id 新的镜像名
docker commit 96feb0 192.168.1.10:5000/testpc:ver2
保持容器在运行中,做了修改后, 直接commit成规范的名字, 然后不需要tag,直接push即可docker push 192.168.1.10:5000/linuxtest:v1
把192.168.1.10:5000/linuxtest:v1推送到服务器,当然注意服务器上registry容器处在运行之中curl http://192.168.1.10:5000/v2/_catalog
查看服务器192.168.1.10上的imagescurl http://192.168.1.10:5000/v2/mypc/tags/list
查看服务器上mypc镜像的信息. 如果遇到http/https的问题,在客户机上做如下处理
vim /etc/docker/daemon.json
里面的内容是一个json对象,加上一项insecure-registries,地址自己更改(docker服务器地址):
{
“insecure-registries”:[“192.168.1.12:5000”]
}
然后重启docker,执行
systemctl daemon-reload docker
systemctl restart docker
导出容器
这里是把镜像打包,不是导出一个正在运行的容器(docker export), 命令如下:
docker save 镜像名 | gzip > 文件名.tar.gz