基本概念
- 镜像(Image):类似系统镜像
- 容器(Container):可以简单理解为镜像提供了运行环境,类似系统硬件环境。容器是基于镜像启动的,并且每个容器都是相互隔离的
- 仓库(Repository):用于存放镜像,类似git仓库
注意:
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等
Docker安装
- 卸载旧版本
$ sudo apt-get remove docker \
docker-engine \
docker.io
- 安装依赖项
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
- 添加GPG密钥
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
#官方源
#$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 添加docker软件源
$ sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
#官方源
#$ sudo add-apt-repository \
#"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
#$(lsb_release -cs) \
#stable"
以上命令会添加稳定版本的 Docker APT 镜像源,如果需要测试版本的 Docker 请将 stable 改为 test。
- 安装Docker
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
- 启动Docker
$ sudo systemctl enable docker
$ sudo systemctl start docker
- 建立docker组
$ sudo groupadd docker
- 将当前用户加入docker组
$ sudo usermod -aG docker $USER
- 重启docker
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
Docker常用指令
- 获取镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
eg:
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
bf5d46315322: Pull complete
9f13e0ac480c: Pull complete
e8988b5b3097: Pull complete
40af181810e7: Pull complete
e6f7c7e5c03e: Pull complete
Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbe
Status: Downloaded newer image for ubuntu:18.04
- 启动一个容器运行镜像
OPTIONS说明:
-d: 分离模式: 在后台运行
-i: 即使没有附加也保持STDIN 打开,可以读取终端输入
-t: 分配一个伪终端,容器的 Shell 映射到当前的 Shell
-p: 容器的 xxx 端口映射到本机的 xxx 端口
--rm: 在容器终止运行后自动删除容器文件
$ docker run -it --rm ubuntu:18.04 bash
$ docker run --name QtDocker -it --rm ubuntu:QtV1 bash
$ docker run --name qt-docker -i --rm ubuntu:16.04 &
$ docker container run -d --rm -p 8000:3000 -it koa-demo:0.0.1
- 列出本地镜像
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 5f515359c7f8 5 days ago 183 MB
nginx latest 05a60462f8ba 5 days ago 181 MB
mongo 3.2 fe9198c04d62 5 days ago 342 MB
<none> <none> 00285df0df87 5 days ago 342 MB
ubuntu 18.04 f753707788c5 4 weeks ago 127 MB
ubuntu latest f753707788c5 4 weeks ago 127 MB
- 查看镜像、容器、数据卷所占用的空间
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 24 0 1.992GB 1.992GB (100%)
Containers 1 0 62.82MB 62.82MB (100%)
Local Volumes 9 0 652.2MB 652.2MB (100%)
Build Cache 0B 0B
- 罗列虚悬镜像(dangling image)
$ docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 00285df0df87 5 days ago 342 MB
- 打包镜像
docker build -t [image name]:[version] [dockerfile所在的目录]
docker build -t test/go-app:v1.0.1 .
- docker tag : 标记本地镜像,将其归入某一仓库。
docker tag ubuntu:15.10 runoob/ubuntu:v3
- 删除虚悬镜像
$ docker image prune
如果删除失败,可以使用如下的强制删除方式:
$ docker rmi -f `docker image ls -f dangling=true -q`
- 删除本地镜像
$ docker image rm [选项] <镜像1ID> [<镜像2ID> ...]
eg:
docker image rm d60f3dc1ba3c 118e37d1bc9f
- 查看容器
docker ps: 查看当前运行的容器
docker ps -a:查看所有容器,包括停止的。
- 删除容器
删除所有容器
$ docker rm [容器ID]
$ docker rm $(docker ps -a -q)
$ docker rm $(docker ps -aq)
删除所有停止的容器
$ docker container prune
- 从容器拷贝文件到宿主机
# 在宿主机下执行
docker cp [容器名]:[文件] [宿主机路径]
- 从宿主机拷贝到容器
# 在宿主机下执行
docker cp [宿主机文件] [容器]:[路径]
eg:
sudo docker cp /etc/apt/sources.list confident_wu:/etc/apt/
- 保存镜像的修改
# 在宿主机下执行
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
eg:
$ docker commit \
--author "fzz <fzz@gmail.com>" \
--message "修改了默认网页" \
webserver \
nginx:v2
sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214
$ docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2 07e334659748 9 seconds ago 181.5 MB
nginx 1.11 05a60462f8ba 12 days ago 181.5 MB
nginx latest e43d811ce2f4 4 weeks ago 181.5 MB
eg2:
docker commit b12e03bb7de7 ubuntu16.04:Qt5.12.6
- 停止运行中的容器
docker stop $CONTAINER_ID
- 执行docker容器里的程序
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
eg:
$ docker exec -i qt-docker /bin/bash /src/build.sh