快速上手docker及docker-compose使用

咕哒 2021年09月03日 45次浏览

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

安装

Centos系列yum安装docker-ce

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli --allowerasing

一键脚本快速安装(通用)

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 或者
curl -sSL https://get.daocloud.io/docker | sh

启动服务并设置开机启动

systemctl strat docker
systemctl enable docker

更换国内源

tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://registry.docker-cn.com"
    ]
} 
EOF

重启docker

systemctl restrat docker

执行docker info看最底下

image

常用命令

搜索镜像

docker search mysql

image-1668138079420

  • NAME: 镜像的名称
  • DESCRIPTION: 镜像的描述
  • STARS: 类似 Github 里面的 star,点赞数
  • OFFICIAL: 是否 docker 官方发布
  • AUTOMATED: 自动构建。

拉取镜像

docker pull mysql

拉取,下载镜像到本地
image-1668138271117

查看镜像

docker images

查看本地已有的镜像
image-1668138356851

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

查看docker进程

docker ps [-a]

默认只显示状态为up的

-a :显示所有的容器,包括未运行的
-f :根据条件过滤显示的内容
-q :静默模式,只显示容器编号

image-1668138672891

  • CONTAINER ID: 容器 ID
  • IMAGE: 使用的镜像
  • COMMAND: 容器内运行的命令
  • CREATED: 容器的创建时间
  • STATUS: 容器状态
  • PORTS: 容器的端口信息和协议类型(tcp\udp)
  • NAMES: 自动分配的容器名称

STATUS有7种:

created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)

创建容器

创建但不启动容器

docker create [OPTIONS] IMAGE

创建并启动容器

docker run [OPTIONS] IMAGE

-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-P: 随机端口映射,容器内部端口随机映射到主机的端口
–name=“fsec”: 为容器指定一个名称;
-v: 绑定一个卷;
–net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

eg:

# 使用镜像nginx:latest在后台起一个名为g0dweb的容器
docker run --name g0dweb -d nginx:latest

image-1668147034543

# 使用镜像nginx:latest在后台起一个名为g0dweb2的容器,并将容器的80端口映射到服务器8080端口,主机的/www目录映射到容器的 /www
docker run --name g0dweb2 -p 8080:80 -v /www:/www -d nginx:latest

image-1668147211475
刚刚创建的两个容器
image-1668147345518
容器里面产生的数据,例如 log 文件,数据库备份文件,容器删除后就丢失了。目录挂载解决以上问题

容器的启停与重启

# 开启容器
docker start [NAME]/[CONTAINER ID]
# 停止容器
docker stop [NAME]/[CONTAINER ID]
# 停止所有容器
docker stop $(docker ps -aq)

Eg:
使用ID停止上面的g0dweb2
image-1668147454823
使用name停止g0dweb
image-1668147477696

进入容器

进入已经启动的容器,使用bash终端

docker exec -it g0dweb /bin/bash

-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
image-1668147748467
创建容器并进入终端,即在前文创建容器的基础上增加-it参数和/bin/bash终端

docker run --name g0dweb3 -it nginx:latest /bin/bash

删除容器

docker rm [NAME]/[CONTAINER ID]

# 删除所有已退出的容器
docker rm $(docker ps -q -f status=exited)
# 删除所有已停止的容器
docker stop $(docker ps -a -q)docker rm $(docker ps -a -q)
# 删除所有容器
docker rm $(docker container ps -aq)

eg:
ID删除
image-1668148219555
NAME删除
image-1668148233622

获取容器日志

docker logs [OPTIONS] CONTAINER

# 显示时间戳查看g0dweb的日志
docker logs -f g0dweb

-f : 跟踪日志输出
–since :显示某个开始时间的所有日志
-t : 显示时间戳
–tail :仅列出最新N条容器日志

通过容器创建镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。

eg:
将容器g0dweb 保存为新的镜像g0dweb:v1,并添加提交人为g0d,说明信息为g0dweb。
image-1668148987369

管理本地镜像

docker images [OPTIONS] [REPOSITORY[:TAG]]

-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
–digests :显示镜像的摘要信息;
-f :显示满足条件的镜像;
–format :指定返回值的模板文件;
–no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。

查看镜像上文中已讲到
删除镜像

docker rmi[NAME]/[CONTAINER ID]

image-1668149244160

文件传输

docker cp 主机路径 容器ID:容器路径
docker cp 容器ID:容器路径 主机路径

把本机的install_database.log复制到容器g0dweb的tmp目录下
image-1668149456845

Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

FROM 				# 构建镜像基于哪个镜像
MAINTAINER			# 镜像维护者姓名或邮箱地址
RUN 				# 构建镜像时运行的指令
ADD				# 拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压
WORKDIR 			# 为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录
VOLUME				# 指定容器挂载点,映射宿主机的目录
EXPOST				# 映射端口
CMD 				# 容器启动的时候要运行的命令,如果有多个则以最后一个为准
ENTRYPOINT 			# 运行容器的时候要执行的命令,可以追加命令
COPY 				# 拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
ENV				# 设置容器环境变量

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
例如:

FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

这会创建三层,可以简写为:

FROM centos
RUN yum -y install wget \
  && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
  && tar -xvf redis.tar.gz

docker-compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

下载安装

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.10.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 或者
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.10.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose
docker-compose -v

Compose 使用的三个步骤:

  1. 使用 Dockerfile 定义应用程序的环境。
  2. 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  3. 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

使用docker-compose.yml创建wordpress容器

version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:

在docker-compose.yml 文件所在目录,执行:docker-compose up就可以跑起来了。
在后台运行只需要加一个 -d 参数docker-compose up -d
查看运行状态:docker-compose ps
停止运行:docker-compose stop
重启:docker-compose restart
重启单个服务:docker-compose restart service-name
进入容器命令行:docker-compose exec service-name sh
查看容器运行log:docker-compose logs [service-name]

https://docs.docker.com/compose/