Docker 简单使用
本文最后更新于 1116 天前,其中的信息可能已经有所发展或是发生改变。

基础操作

  • 登陆docker login -u 用户名 -p 密码
  • 登出docker logout
  • 保存镜像docker save -o nginx.tar nginx
  • 加载镜像docker load -i nginx.tar

Image 镜像

  • 查看镜像列表docker image ls,简写docker images
  • 拉取镜像docker image pull REPOSITORY,简写docker pull REPOSITORY
  • 推送镜像docker image push {USERNAME}/REPOSITORY,简写docker push {USERNAME}/REPOSITORY
  • 通过 Dockerfile 构建本地镜像docker image build -t REPOSITORY .,简写docker build -t REPOSITORY ..意味着按照当前目录下的 Dockerfile 文件去构建
  • 删除镜像docker image rm {IMAGE ID},简写docker rmi {IMAGE ID}
  • 查看镜像构造日志docker history {IMAGE ID}

Container 容器

  • 查看容器运行列表docker container ls,简写docker ps
  • 查看容器列表docker ps -a
  • 只显示容器IDdocker ps -q
  • 查看运行状态是退出的容器docker ps -f "status=exited"
  • 运行容器docker run REPOSITORY
  • 指定版本和名字docker run --name NAME REPOSITORY:TAG
  • 后台运行docker run -d REPOSITORY
  • 端口映射docker run -p 80:8080 REPOSITORY:前面的数字对应本机,后面的数字对应容器
  • 配置环境变量docker run -e KEY=VALUE REPOSITORY,Linux 查看环境变量的命令是env
  • 文件挂载docker run -v /home/mydata:/var/lib/mysql REPOSITORY:前面的路径对应本地文件,后面的路径对应容器文件
  • 连接其他容器docker run --link {CONTAINER ID} REPOSITORY
  • 连接网络docker run --network {NETWORK ID} REPOSITORY,简写docker run --net {NETWORK ID} REPOSITORY
  • 交互式运行docker run -it REPOSITORY [CMD],即在容器运行的同时进入容器内部
  • 分配内存docker run --memory=200M REPOSITORY,在设置--memory=200M时,默认也会使--memory-swap=200M所以总内存为400M
  • 限制 CPU 使用权重docker run --cpu-shares=10 REPOSITORY。比如 A 容器的--cpu-shares=15,B 容器的--cpu-shares=5,那么 A 容器会占 cup 使用率的 75%,B 容器只占 25%
  • 更多设置请参考docker run --help
  • 开启容器docker container start {CONTAINER ID},简写docker start {CONTAINER ID}
  • 关闭容器docker container stop {CONTAINER ID},简写docker stop {CONTAINER ID}
  • 重启容器docker container restart {CONTAINER ID},简写docker restart {CONTAINER ID}
  • 通过现有容器构建本地镜像docker container commit {CONTAINER ID} REPOSITORY[:TAG],简写docker commit {CONTAINER ID} REPOSITORY[:TAG]
  • 删除容器docker container rm {CONTAINER ID},简写docker rm {CONTAINER ID}
  • 强制删除容器docker rm -f {CONTAINER ID},不论容器是否正在运行
  • 删除所有没有运行的容器docker rm $(docker ps -aq -f "status=exited")
  • 进入容器docker exec -it {CONTAINER ID} CMD
  • 查看容器详情docker inspect {CONTAINER ID}
  • 查看容器日志docker logs {CONTAINER ID}

Network 网络空间

  • 查看网络列表docker network ls
  • 查看网络详情docker netowrk inspect {NETWORK ID}
  • 创建网络docker network create -d DRIVER {NETWORK NAME}
  • 连接网络docker network connect {NETWORK ID} {CONTAINER ID}

注意:多个容器如果连接到用户自定义的网络(network),那么它们相互默认连接--link

DRIVER 驱动

  • bridge:映射到本地的网络空间,可以将多个容器分配(映射)到不同端口。
  • host:复制本地网络空间,会导致由同一镜像产生的多个容器发生端口占用情况。
  • null:独立的网络空间(没有IP),只提供内部连接,外部无法访问。
  • overlay:多机容器之间的网络通信,docker 集群依赖分布式存储(eg:etcd)。

VOLUME 数据卷

  • 查看数据卷列表docker volume ls
  • 查看数据卷详情docker volume inspect {VOLUME NAME}
  • 创建数据卷docker volume create {VOLUME NAME}
  • 删除数据卷docker volume rm {VOLUME NAME}

Dockerfile

FROM 指定基础镜像

FROM scratch,制作 base image

FROM centos[:TAG],使用 centos image

LABEL 简单描述

LABEL maintainer="tenbeggar",作者信息

LABEL version="1.0",版本信息

LABEL description="This is a simple message",描述信息

RUN 执行命令

RUN yum update \ #反斜杠换行
&& yum install -y vim

WORKDIR 指定当前工作目录

WORKDIR /test,如果没有该目录则会自动创建

WORKDIR /home
WORKDIR demo
RUN pwd #输出结果是 /home/demo

ADD & COPY 将本地当前所在目录下的文件 添加/拷贝 到镜像

ADD test.tar.gz /,添加到根目录并解压

COPY test.tar.gz /,拷贝到根目录,COPYADD的主要区别就是ADD会自动解压缩,而COPY的性能优于ADD

WORKDIR /root
ADD hello test/ #目录结构是 /root/test/hello

ENV 设置常量

ENV MYSQL_VERSION 5.6 #设置常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \ #引用常量
&& rm -rf /var/lib/apt/lists/*

ENTRYPOINT & CMD

  • RUN:执行命令并创建新的 Image Layer,构建镜像时执行的命令
  • ENTRYPOINT:容器启动时执行的命令
  • 让容器以应用程序的形式运行
  • 不会被忽略,一定会执行
  • CMD:容器启动后默认执行的命令
  • 如果docker run -it REPOSITORY CMD指定了其他命令,CMD命令被忽略
  • 如果定义了多个CMD,只有最后一个会执行
  FROM ubuntu
  RUN apt-get update && apt-get install -y stress
  ENTRYPOINT ["/usr/bin/stress"]
  CMD [] #接收docker run -it REPOSITORY CMD传入的参数

Shell & Exec

若使用Shell格式,则容器在执行Shell命令前会先启动/bin/sh -c命令并占用PID=1进程(Docker和宿主机通信进程),被其他命令占用会导致docker stop CONTAINER等命令失效。

  • Shell 格式
  RUN apt-get install -y vim
  CMD echo "hello docker"
  ENTRYPOINT echo "hello docker"
  • Exec 格式(推荐)
  RUN ["apt-get","install","-y","vim"]
  CMD ["/bin/bash","-c","echo hello docker"]
  ENTRYPOINT ["/bin/bash","-c","echo hello docker"]

VOLUME 挂载存储

VOLUME /var/lib/mysql,将容器内的/var/lib/mysql目录挂载到容器运行时临时生成的本地目录中,可通过docker inspect {CONTAINER ID}查看本地目录具体位置。

EXPOSE 端口暴露

EXPOSE 8080,声明容器应该打开的端口(8080),联合容器运行时的-p参数使用

Docker Compose

安装 Dokcer Compose

  1. 运行如下命令下载 Docker Compose 稳定版本:
   sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

要安装其他版本的Compose,请替换1.25.0 为要使用的Compose版本。

  1. 给 docker-compose 二进制文件添加可执行权限:
   sudo chmod +x /usr/local/bin/docker-compose
  1. 查看版本docker-compose version

基本使用

  • 查看使用到的镜像docker-compose images
  • 查看运行中的容器docker-compose ps
  • 构建镜像docker-compose build
  • 启动服务docker-compose up [-f docker-compose.yaml]-f用于指定 .yaml 配置文件,启动服务前会默认先执行构建镜像命令
  • 后台启动docker-compose up -d
  • 启动N个服务docker-compose up --scale {SERVICE NAME}=N
  • 开启服务docker-compose start
  • 关闭服务docker-compose stop
  • 删除服务docker-compose rm
  • 进入容器docker-compose exec {SERVICE NAME} CMD

docker-compose.yaml

version: "3" #此处需要和你的docker-compose版本一致

services: #服务,整合容器
  db: #服务名称(自定义)
    image: mysql:5.7 #指定服务镜像REPOSITORY:TAG
    volumes: #挂载目录 -v
      - db_data:/var/lib/mysql
    restart: always #总是重启
    environment: #环境变量 -e
      MYSQL_ROOT_PASSWORD: 76543
      MYSQL_DATABASE: wordpress
      MYSQL_USER: worduser
      MYSQL_PASSWORD: wordpwd

  wordpress:
    depends_on: #指定容器启动依赖,先启动依赖,代替links
      - db
    # links: #连接其他容器 --link
    #   - dbmaster
    image: wordpress:latest
    ports: #端口映射 -p
      - 80:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: worduser
      WORDPRESS_DB_PASSWORD: wordpwd

  web:
    build: #声明通过Dockerfile构建
      context: . #目录
      dockerfile: Dockerfile #文件
    ports:
      - 8080:8080
    networks: #网络空间 --network
      - my_net

volumes: #数据卷
  db_data: #名称(自定义)
networks: #网络空间
  my_net: #名称(自定义),默认DRIVER驱动为bridge
如果觉得本文对您有帮助,记得收藏哦~
下一篇