docker 常用命令

  • 2020-07-10
  • 浏览 (65)

info

image = 镜像

container = 容器

配置镜像加速器

针对Docker客户端版本大于 1.10.0 的用户

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://mfxrv3sj.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

启动镜像

docker run \
  --name nginx \
  --privileged=true \
  -d -p 80:80 \
  --restart always \
  -v /usr/local/dist:/usr/local/dist \
  -v /home/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro \
  -v /home/docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
  nginx:1.15.5

启动容器

docker start containerId

停止容器

docker stop containerId

查看镜像

docker image ls

查看容器

docker ps
# or
docker container ls
#查看所有 
docker ps -a

删除image

docker  rmi imageId
# or
docker image rm imageId

删除容器

#先停止
docker stop containerId
docker rm containerId
#强制删除,不用先停止,直接删除
docker rm -f containerId

批量删除操作

  1. 停止容器

docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')

  1. 删除容器

docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')

  1. 删除镜像

docker rmi $(docker images | grep "none" | awk '{print $3}')

删除容器后,清理容器的网络占用

#格式:docker network disconnect --force 网络模式 容器名称

docker network disconnect --force bridge containerId

检查网络模式信息

#格式:docker network inspect 网络模式

docker network inspect bridge

查看容器使用资源

#查看mysql nginx镜像使用资源情况
docker stats mysql nginx

通过dockerfile构建镜像

#构建 redis-server 的 dockerfile
FROM ubuntu

ENV VER     3.0.0  
ENV TARBALL http://download.redis.io/releases/redis-$VER.tar.gz

RUN echo "==> Install curl and helper tools..."  && \  
    apt-get update                      && \
    apt-get install -y  curl make gcc   && \
    echo "==> Download, compile, and install..."  && \
    curl -L $TARBALL | tar zxv  && \
    cd redis-$VER               && \
    make                        && \
    make install                && \
    echo "==> Clean up..."  && \
    apt-get remove -y --auto-remove curl make gcc  && \
    apt-get clean                                  && \
    rm -rf /var/lib/apt/lists/*  /redis-$VER
#...
CMD ["redis-server"]

#构建镜像,后面的.代表的是相对路径的当前目录,如果需要全路径则为/root/docker_demo(就是找到Dockerfile文件)
docker build -t centos_nginx:v1 .

大家在定义Dockerfile时,如果太多的使用RUN指令,经常会导致镜像有特别多的层,镜像很臃肿,而且甚至会碰到超出最大层数(127层)限制的问题,遵循 Dockerfile 最佳实践,我们应该把多个命令串联合并为一个 RUN(通过运算符&&和/ 来实现),每一个 RUN 要精心设计,确保安装构建最后进行清理,这样才可以降低镜像体积,以及最大化的利用构建缓存。

通过容器执行命令

docker run alpine echo '123'

进入alpine容器

进入容器一般都可以执行 docker exec -it 镜像id bash ,但是alpine没有bash,可以使用 docker exec -it 镜像id sh

docker save和docker export 区别

  1. docker save保存的是镜像(image),docker export保存的是容器(container)
  2. docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像
  3. docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称

*注:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

docker save 和 docker export 使用

#save 镜像 postgres:9.6 mongo:3.4
docker save -o images.tar postgres:9.6 mongo:3.4

#load 镜像包
docker load -i images.tar

#export 容器 postgres
docker export -o postgres-export.tar postgres

# import 容器 postgres ,导入之后恢复为镜像,标签为 postgres:latest
docker import postgres-export.tar postgres:latest

宿主机和容器质检拷贝文件

#从宿主机拷贝文件到容器
docker cp xxx.tar.gz containerId:/path

#从容器拷贝文件到宿主机
docker cp containerId:/path/xxx.tar.gz /path

docker commit

#格式
docker commit  -m="提交的描述信息"  -a="作者"   容器id   要创建的目标镜像名:[标签名]

docker commit 不适合生成镜像

当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录与容器存储层里。而Docker提供了一个docker commit 的命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,在叠加上容器的存储层,并构成信的镜像,以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

使用docker commit命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。

首先,如果在安装软件,编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像及其臃肿。

此外,使用docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制定镜像的人知道执行过什么命令,怎么生成的镜像,别人根本无从得知,而且,即使是这个制作镜像的人,过一段时间后也无法记清具体的操作的。虽然docker diff或许可以得到一点线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。

而且,任何修改的结果仅仅是在当前层进行标记,添加,修改,而不会改动上一层。如果使用docker commit制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到,这会使镜像更加臃肿。

docker commit有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用docker commmit定制镜像,定制行为应该使用Dockerfile来完成。

正文到此结束