本文最后更新于 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 - 只显示容器ID
docker 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 /,拷贝到根目录,COPY和ADD的主要区别就是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
- 运行如下命令下载 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版本。
- 给 docker-compose 二进制文件添加可执行权限:
sudo chmod +x /usr/local/bin/docker-compose
- 查看版本
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