docker常用操作

| 标签 linux  docker  浏览次数: -

安装

  • 1.前提条件

Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。

  • 2.查看内核版本
uname -r
  • 3.获取最新版本的 Docker 安装包
wget -qO- https://get.docker.com | sh # 需要输入root密码
sudo systemctl start docker

sudo systemctl stop docker

6.镜像加速

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。

新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。

请在该配置文件中加入(没有该文件的话,请先建一个):

{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

7.测试运行hello world

docker run ubuntu:16.04 /bin/echo Hello world

各个参数解析:

  • docker: Docker 的二进制执行文件。
  • run: 与前面的 docker 组合来运行一个容器。
  • ubuntu:16.04: 指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
  • /bin/echo Hello world: 在启动的容器里执行的命令

redhat6.7安装

rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum -y install docker-io

基本使用

运行交互式的容器

我们通过docker的两个参数 -i -t,让docker运行的容器实现”对话”的能力

docker run -i -t ubuntu:16.04 /bin/bash

各个参数解析:

  • -t: 在新容器内指定一个伪终端或终端。
  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

启动容器(后台模式)

  • 使用以下命令创建一个以进程方式运行的容器
docker run -d ubuntu:16.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

返回的输出结果是容器的ID,对每个容器时唯一的

检查容器是否在运行

docker ps
  • CONTAINER ID:容器ID
  • NAMES:自动分配的容器名称

查看容器内标准输出

docker logs 容器ID

或者

docker logs 容器名字

停止容器

docker stop 容器ID

或者

docker stop 容器名称

查看docker命令行选项

docker  # 查看到 Docker 客户端的所有命令选项

docker build --help  # 查看build的详细用法

构建镜像

docker build -t 镜像名 .  # 其中`.`代表在当前路径在构建

重命名镜像

docker tag IMAGE ID(镜像ID) REPOSITORY:TAG(仓库:标签)

比如

docker tag d698781c1863 ftp:ftp

重命名后原来旧的镜像还是存在,只是多了 ftp:ftp 的镜像而已

修改容器保存为新的image

docker commit -h
Flag shorthand -h has been deprecated, please use --help

Usage:    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
  -c, --change list      Apply Dockerfile instruction to the created image
      --help             Print usage
  -m, --message string   Commit message
  -p, --pause            Pause container during commit (default true)
  • -a: 作者信息
  • -c: 使用Dockerfile指令来创建镜像,不确定 -c 参数的使用场景
  • -m: 本次修改的描述信息
  • -p: 默认情况下,在提交时,容器的执行将被暂停,以保证数据的完整性,可以指定选项 p 来禁止。

Docker 并不建议用户通过这种方式构建镜像。原因如下:

  • 这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。比如要在 debian base 镜像中也加入 vi,还得重复前面的所有步骤。
  • 更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患。

查看镜像详细信息

docker inspect IMAGE NAME(镜像名)|IMAGE ID(镜像ID)

进入容器方式

  • 1.attach
docker attach 容器ID|容器名

缺点:当多个窗口同事使用该方式进入时,所有的窗口都同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。即只有一个窗口可以操作容器。

  • 2.使用SSH

需要容器提供了sshd服务,不建议使用。

  • 3.使用nsenter
  • 4.使用exec
docker exec -it 容器ID|容器名 bash

迁移镜像

发布到Docker镜像中心

1.登陆

docker login

之后会让输入用户名、密码,没有则先在Docker镜像中心注册

2.镜像打tag

重命名镜像

3.发布镜像

docker push username/repository:tag

转为文件传输

1.保存为文件

docker save -o /tmp/test.tar 镜像名

2.确认文件是否生成

ls -l /tmp/test.tar

3.恢复镜像

docker load -i /tmp/test.tar

4.检查是否恢复成功

docker images

修改容器配置

比如要修改容器的映射端口

常规方法

  • 1.停止容器, docker stop
  • 2.保存为新的image, docker commit
  • 3.重新运行容器, docker run 指定新的端口和镜像

修改json文件方式

  • 1.停止容器, docker stop
  • 2.修改json配置文件,找到端口映射部分内容进行修改,文件位置/var/lib/docker/containers/容器id
    • hostconfig.json
    • config.v2.json # 可能会不需要改
  • 3.重启docker, service docker restart
  • 4.重新运行容器, docker run

查看dockerfile内容

当pull一个镜像后,不知道Dockerfile里面的内容,看知道一些基本的信息,可以用以下方式

1.查看镜像的ID

docker images

2.查看json文件内容

find / -name "镜像ID*"  | xargs cat | python -m json.tool

或者可以尝试逆向分析,请参考从镜像历史记录逆向分析出Dockerfile

从私有仓库拉取镜像

1.修改daemon.json文件

vi /etc/docker/daemon.json

{
    "insecure-registries": ["registry.xxx.com"]
}

2.重启docker

systemctl daemon-reload && systemctl restart docker

3.登陆

docker login -u admin -p admin registry.xxx.com

4.pull镜像

docker pull registry.xxx.com/project/IMAGE-NAME:latest

搭建本地Registry

codekoala/pypi镜像作为示例

目标私服启动镜像

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

上传镜像到私服

  • 1.修改hosts文件,添加域名和IP的映射
  • 2.对镜像打tag
docker tag codekoala/pypi private.docker.hub:5000/codekoala/pypi

repository 的完整格式为:[registry-host]:[port]/[username]/xxx,只有 Docker Hub 上的镜像可以省略 [registry-host]:[port] 。

  • 3.上传镜像
docker push private.docker.hub:5000/codekoala/pypi
  • 4.下载镜像
docker pull private.docker.hub:5000/codekoala/pypi

registry 也支持认证,https 安全传输等特性,具体可以参考官方文档

批量删除容器

docker rm -v $(docker ps -aq -f status=exited)

中国官方镜像加速

  • /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

删除所有镜像

docker images | awk '{if(NR>1)print $3}' | xargs -I {} docker rmi {} --force

上一篇 迭代器/生成器简介     下一篇 搭建私有pip源
目录导航