第一本docker书笔记
-
docker run -i -t ubuntu /bin/bash
- -i 保证容器中的STDIN是开启的
- -t 为创建的容器分配一个伪tty终端,新容器从而能提供一个交互式shell
- docker help run
- 基于ubuntu镜像来创建容器
- 在新容器中要运行 /bin/bash 命令
- --restart=always
- --restart=on-failure:5 由于某种错误导致容器停止运行后,会自动重新启动该容器最多5次
-
docker stop XXX
-
docker exec -d XXX touch /etc/new_config_file
- 在容器的内部额外启动新进程:后台任务 或 交互式任务
- 在XXX容器内部运行一个后台进程,执行的操作是touch
-
docker exec -it XXXX /bin/bash
- 在XXX容器中启动一个打开shell的交互式任务
-
本地镜像保存在 /var/lib/docker/containers
-
(基于已有的基础镜像)构建镜像
- docker commit contiainerID repositoryName/containerName
- docker build + Dockerfile
- 执行步骤
- Docker 从基础镜像运行一个容器
- 执行一条指令,对容器做出修改
- 执行类似docker commit的操作,提交一个新的镜像层
- Docker再基于刚提交的镜像运行一个容器
- 执行Dockerfile中的下一条指令,直到所有指令都执行完毕
- RUN
- 在当前镜像中运行指定的命令,会创建一个新的镜像层,如果指令执行成功,会将此镜像层提交
- 默认会在shell里使用命令包装器/bin/sh -c来执行
- 有exec格式的RUN指令
- 执行步骤
基础命令
-
检查容器的主机名
- hostname
- cat /etc/hosts
- ip a
-
镜像 & 容器
- http://dockone.io/article/783
- 容器 = 镜像 + 可读写层
- 镜像存储在Docker registry
-
常用命令1
- docker create
- 为指定的镜像创建可读可写层,构成了一个新的容器
- 创建一个容器但不运行它
- docker start
- 为容器文件系统创建了一个进程隔离空间
- 重新启动一个已停止的容器(docker restart 也可以)
- docker attach
- 重新附着到容器的会话上
- docker run
- 先是利用镜像创建了一个容器,然后运行这个容器
- docker create和docker start两个命令的组合
- docker ps
- 列出所有运行中的容器
- docker ps -a
- 列出所有的容器,不管是运行的,还是停止的
- docker images
- 列出所有顶层(top-level)镜像
- docker images -a
- 列出了所有的镜像,也可以说是列出了所有的可读层
- docker stop
- docker kill
- docker pause
- docker rm
- docker create
-
常用命令2
- docker info
- 验证安装正确
- docker pull
docker pull registry.docker-cn.com/library/centos:7
- docker help
- 查看所有命令
- docker search
- 查找在registry中的镜像
- docker info
-
常用命令3
- 参考Docker退出容器不关闭容器的方法
- ctrl + p + q 退出登录但不关闭镜像
- docker attach ID 进入镜像
- 使用docker start DOCKER-NAME启动容器,docker exec ... 之后做修改,exit退出,再进入容器上次修改还在
-
常用命令4
- 启动容器
docker run --name DOCKER_NAME -it -v /host_dir:/docker_dir IMAGE_NAME:TAG -p host_port:docker_port /bin/bash
IMAGE_NAME顺序在-v之后docker start DOCKER_NAME
docker exec -it DOCKER_NAME /bin/bash
- 退出容器
- exit
- 删除容器
- docker rm
- 删除镜像
- docker rmi
- 编写启动命令
alias g2d='docker exec -i -t $(docker ps -l -q) /bin/bash'
vi /usr/bin/startDocker
- 启动容器
docker start DOCKER-NAME
docker exec -it DOCKER-NAME /bin/bash
-
常用命令5
- 从主机复制到容器
- docker cp host_path containerID:container_path
- 从容器复制到主机
- docker cp containerID:container_path host_path
- 从主机复制到容器
-
常用命令6
- 保存容器
- docker commit ID NAME
- 参考
- 保存容器
-
查看容器占用磁盘情况
- docker system -h
- docker system df -h
- docker ps -h
- docker ps --size -
容器权限控制
- --privileged
- 拥有特权:所有cap,获取主机device等
- --cap-add
- --cap-drop
- --privileged
-
在docker中使用gdb以及ptrace
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined
docker run --cap-add=SYS_PTRACE --security-opt seccomp:unconfined
- 参考
docker run --net=host --privileged --cap-add=SYS_PTRACE --name NAME -it IMAGE_NAME /bin/bash
制作镜像
Dockerfile示例:
FROM docker-repository/os
ENV TZ Asia/Shanghai
ENV LANG en_US.UTF-8
RUN cd /etc/yum.repos.d && curl http://mirrors.163.com/.help/CentOS7-Base-163.repo > CentOS-Base.repo
RUN yum install -y vim wget git make cmake gcc gcc-c++ openssl openssl-devel libwebp-devel libwebp fontconfig.x86_64 fontconfig-devel.x86_64 crontabs.noarch valgrind.x86_64 valgrind-devel.x86_64 gdb net-tools supervisor sshpass
RUN yum install -y java
ENV JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre"
ADD XXX.tar.gz /usr/local
ARG PATH
ENV PATH=${PATH}:/usr/local/XXX/bin
执行脚本示例:
image="docker-repository/os/service:0.1"
docker build -t $image .
更改data-root目录
/etc/docker/daemon.json 文件追加 "data-root": "/data/docker"
彻底删除overlay2
- 停止并删除所有容器
- systemctl stop docker
- docker system prune -a
- rm -rf /var/lib/docker
- systemctl start docker
参考
Docker入门教程:15个Docker基本命令及用法
docker的常用命令汇总
How to analyze disk usage of a Docker container