docker 知识
安装
# 安装依赖包
yum install -y yum-utils
# 加 yum 软件源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 更新 yum 软件源缓存,并安装 docker-ce
yum install docker-ce docker-ce-cli containerd.io
# FirewallBackend=nftables 关闭防火墙
FirewallBackend=iptables
# 启动
systemctl enable docker
systemctl start docker
获取镜像
# docker pull --help
# docker pull 应用名:【标签】
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
运行
docker run -it --rm ubuntu:18.04 bash
docker exec -it nginx /bin/bash
# -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
# --rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
# ubuntu:18.04:这是指用 ubuntu:18.04 镜像为基础来启动容器
# bash:放在镜像名后的是 命令,这里我们希望有个交互式 Shell,因此用的是 bash
列出镜像
$ 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 329ed837d508 3 days ago 63.3MB
ubuntu bionic 329ed837d508 3 days ago 63.3MB
列表包含了
仓库名
、标签
、镜像 ID
、创建时间
以及所占用的空间
。其中仓库名、标签在之前的基础概念章节已经介绍过了。镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个 标签。因此,在上面的例子中,我们可以看到
ubuntu:18.04
和ubuntu:bionic
拥有相同的 ID,因为它们对应的是同一个镜像。
镜像体积
#镜像、容器、数据卷所占用的空间
$ 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
删除本地镜像
#先将运行容器暂停删除才能删除镜像
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker image rm $(docker images)
$ docker image rm [选项] <镜像1> [<镜像2> ...]
# 我们需要删除所有仓库名为 redis 的镜像
$ docker image rm $(docker image ls -q redis)
# 删除所有在 mongo:3.2 之前的镜像
$ docker image rm $(docker image ls -q -f before=mongo:3.2)
dockerfile定制镜像
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
vi Dockerfile
#dockerfile 文件内容
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
#构建镜像
build -t nginx:v3 .
docker还能通过git、tar压缩包进行构建相应的镜像
run执行命令
- shell 格式:
RUN <命令>
,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的RUN
指令就是这种格式。 - exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
,这更像是函数调用中的格式。
copy复制文件
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目标路径>
可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR
指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录。
此外,还需要注意一点,使用 COPY
指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用。特别是构建相关文件都在使用 Git 进行管理的时候。
add更高级的复制文件
docker compose
#二进制安装
curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 国内用户可以使用以下方式加快下载
curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker 常用命令
docker stop $(docker ps -q)
docker rm $(docker ps -aq)
docker 实战wordpress
version: "3"
services:
db:
image: mysql:8.0
command:
- --default_authentication_plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
volumes:
- wp_data:/var/www/html
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
nginx:
depends_on:
- wordpress
image: nginx:latest
ports:
- "80:80"
- "443:443"
restart: always
volumes:
- ng_data:/etc/nginx
volumes:
db_data:
ng_data:
wp_data:
docker-compose up -d
#后台执行