1、Docker安装与启动
-
安装docker依赖
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
-
设置docker的yum源
$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
-
安装最新版的docker
$ sudo yum install docker-ce docker-ce-cli containerd.io
-
指定版本安装docker
$ yum list docker-ce --showduplicates | sort -r $ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io $ sudo yum install docker-ce-18.09.5-3.el7 docker-ce-cli-18.09.5-3.el7 containerd.io
-
启动docker
$ sudo systemctl enable docker $ sudo systemctl start docker
-
关闭docker
$ sudo systemctl stop docker
-
镜像加速
2、Images 镜像命令
2.1 查看本机镜像
docker images [options] -------------------------- 列出本地所有镜像
docker image -a -------------------------- 列出所有镜像(包含中间映像层)
docker image -q -------------------------- 只显示镜像id
2.2 搜索镜像
docker search [options] 镜像名 ------------------- 去dockerhub上查询当前镜像
-s 指定值 列出收藏数不少于指定值的镜像
--no-trunc 显示完整的镜像信息
2.3 拉取镜像
docker pull 镜像名[:TAG|@DIGEST] ----------------- 下载镜像
docker pull 镜像名 (下载最新版)
2.4 删除镜像
docker rmi 镜像名 -------------------------- 删除镜像
docker rmi -f 强制删除
3、Container 容器命令
3.1 运行容器
docker run 镜像名 -------------------------- 镜像名新建并启动容器
--name 别名为容器起一个名字
-d 启动守护式容器(在后台启动容器)
-p 映射端口号:原始端口号 指定端口号启动
例: docker run -it --name myTomcat -p 8888:8080 tomcat
docker run -d --name myTomcat -P tomcat
3.2 查看运行的容器
docker ps -------------------------- 列出所有正在运行的容器
docker ps -a 正在运行的和历史运行过的容器
docker ps -q 静默模式,只显示容器编号
3.3 停止|关闭|重启容器
docker start 容器名字或者容器id --------------- 开启容器
docker restart 容器名或者容器id --------------- 重启容器
docker stop 容器名或者容器id ------------------ 正常停止容器运行
docker kill 容器名或者容器id ------------------ 立即停止容器运行
3.4 挂载数据卷
docker run -v 宿主机的路径|任意别名:/容器内的路径 镜像名
注意:
1.如果是宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容
2.如果是别名则会在docker运行容器时自动在宿主机中创建一个目录,并将容器目录文件复制到宿主机中
3.5 查看容器的运行日志
docker logs [OPTIONS] 容器id或容器名 ------------------ 查看容器日志
-t 加入时间戳
-f 跟随最新的日志打印
--tail 数字 显示最后多少条
3.6 删除容器
docker rm -f 容器id和容器名
docker rm -f $(docker ps -aq) -------------------------- 删除所有容器
3.7 进入容器内部
docker exec [options] 容器id 容器内命令 ------------------ 进入容器执行命令
-i 以交互模式运行容器,通常与-t一起使用
-t 分配一个伪终端 shell窗口 bash
3.8 容器和宿主机之间复制文件
docker cp 文件|目录 容器id:容器路径 ----------------- 将宿主机复制到容器内部
docker cp 容器id:容器内资源路径 宿主机目录路径 ----------------- 将容器内资源拷贝到主机上
3.9 其他
docker top 容器id或者容器名 --- 查看容器内的进程
docker inspect 容器id ---- 查看容器内部细节
docker save 镜像名 -o 名称.tar ---- 打包镜像
docker load -i 名称.tar ---- 载入镜像
docker commit -m "描述信息" -a "作者信息" (容器id或者名称)打包的镜像名称:标签 ----容器打包成新的镜像
4、Dockerfile 构建镜像
我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dockerfile 是镜像和容器的关键,Dockerfile 可以非常容易的定义镜像内容。
4.1 编写Dockerfile
FROM 指定基础镜像
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
通过 FROM 指定的镜像,可以是任何有效的基础镜像。FROM 有以下限制:
- FROM 必须 是 Dockerfile 中第一条非注释命令
- 在一个 Dockerfile 文件中创建多个镜像时,FROM 可以多次出现。只需在每个新命令 FROM 之前,记录提交上次的镜像 ID。
- tag 或 digest 是可选的,如果不使用这两个值时,会使用 latest 版本的基础镜像
RUN 执行命令
#shell格式
RUN <command>
#exec格式
RUN ["executable", "param1", "param2"]
- RUN 命令将在当前 image 中执行任意合法命令并提交执行结果。命令执行提交后,就会自动执行 Dockerfile 中的下一个指令。
- 层级 RUN 指令和生成提交是符合 Docker 核心理念的做法。它允许像版本控制那样,在任意一个点,对 image 镜像进行定制化构建。
- RUN 指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定
--no-cache
参数,如:docker build --no-cache
。
COPY 复制文件
COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]
COPY 指令将从构建上下文目录中 <源路径>
的 文件或目录 复制到新的一层的镜像内的<目标路径>
位置。
<源路径>
可以是多个,甚至可以是通配符 如:COPY hom?.txt /mydir/
<目标路径>
可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR 指令来指定)。如果目录不存在会在复制文件前先行创建缺失目录。
ADD 更高级的复制文件
ADD <源路径>... <目标路径>
ADD ["<源路径>",... "<目标路径>"]
ADD功能与COPY类似,但ADD更高级。其<源路径>
可以是一个 URL,这种情况下,Docker 引擎会试图去下载这个链接的文件放到<目标路径>
去。
ENV 设置环境变量
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
# 例:
ENV VERSION=1.0 DEBUG=on \
NAME="Happy Feet"
ENV指令可以设置环境变量,无论是后面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。
EXPOSE 暴露端口
EXPOSE <port> [<port>...]
EXPOSE 指令为构建的镜像设置监听端口,使容器在运行时监听。
VOLUME 定义匿名卷
VOLUME ["/data"]
VOLUME 用于创建挂载点,即向基于所构建镜像创始的容器添加卷:
WORKDIR 指定工作目录
WORKDIR用于在容器内设置一个工作目录:
WORKDIR /path/to/workdir
通过WORKDIR设置工作目录后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行。
如,使用WORKDIR设置工作目录:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
在以上示例中,pwd 最终将会在 /a/b/c
目录中执行。在使用 docker run 运行容器时,可以通过-w
参数覆盖构建时所设置的工作目录。
CMD 指定启动时执行的命令
CMD用于指定在容器启动时所要执行的命令。CMD 有以下三种格式:
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
省略可执行文件的 exec 格式,这种写法使 CMD 中的参数当做 ENTRYPOINT 的默认参数,此时 ENTRYPOINT 也应该是 exec 格式,具体与 ENTRYPOINT 的组合使用。
与 RUN 指令的区别:RUN 在构建的时候执行,并生成一个新的镜像,CMD 在容器运行的时候执行,在构建时不进行任何操作。
ENTRYPOINT 配置一个可执行程序
ENTRYPOINT 用于给容器配置一个可执行程序。也就是说,每次使用镜像创建容器时,通过 ENTRYPOINT 指定的程序都会被设置为默认程序。ENTRYPOINT 有以下两种形式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
ENTRYPOINT 与 CMD 非常类似,不同的是通过docker run
执行的命令不会覆盖 ENTRYPOINT,而docker run
命令中指定的任何参数,都会被当做参数再次传递给 ENTRYPOINT。Dockerfile 中只允许有一个 ENTRYPOINT 命令,多指定时会覆盖前面的设置,而只执行最后的 ENTRYPOINT 指令。
docker run
运行容器时指定的参数都会被传递给 ENTRYPOINT ,且会覆盖 CMD 命令指定的参数。如,执行docker run <image> -d
时,-d 参数将被传递给入口点。也可以通过docker run --entrypoint
重写 ENTRYPOINT 入口点。
如:可以像下面这样指定一个容器执行程序:
# Version: 0.0.3
FROM ubuntu:16.04
MAINTAINER 666 "842649759@qq.com"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hello World, 我是个容器' \
> /var/www/html/index.html
ENTRYPOINT ["/usr/sbin/nginx"]
EXPOSE 80
使用docker build构建镜像,并将镜像指定为 itbilu/test:
docker build -t="itbilu/test" .
构建完成后,使用itbilu/test启动一个容器:
docker run -i -t itbilu/test -g "daemon off;"
在运行容器时,我们使用了 -g "daemon off;"
,这个参数将会被传递给 ENTRYPOINT,最终在容器中执行的命令为 /usr/sbin/nginx -g "daemon off;"
。
4.2 构建镜像docker build
docker build
命令会根据 Dockerfile 文件及上下文构建新 Docker 镜像。构建上下文是指 Dockerfile 所在的本地路径或一个URL(Git仓库地址)。
docker build .
# 表示根据当前目录下的dockerfile构建镜像
-f
指定该文件的位置
docker build -f /usr/local/Dockerfile .
-t
指定构建成镜像的仓库、标签。
docker build -t webapp/v1 .
4.3 案例:Dockerfile构建Springboot应用
FROM openjdk:8-jre
ENV APP_PATH=/apps
WORKDIR $APP_PATH
ADD te_wxAPI-0.0.1-SNAPSHOT.jar $APP_PATH/app.jar
EXPOSE 7777
# 执行命令
ENTRYPOINT ["java","-jar"]
CMD ["app.jar"]
5、Docker-compose 服务编排
Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。
Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。
5.1 安装 Docker-compose
#下载
sudo curl -L https://github.com/docker/compose/releases/download/1.20.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#安装
chmod +x /usr/local/bin/docker-compose
#查看版本
docker-compose version
5.2 编写docker-compose.yml 文件
5.3 Docker Compose 常用命令
# 在后台启动服务
docker-compose up -d
# 命令查看启动的服务
docker-compose ps
# 停止服务
docker-compose stop
其他命令
#查看帮助
docker-compose -h
# -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d
#启动所有容器,-d 将会在后台启动并运行所有的容器
docker-compose up -d
#停用移除所有容器以及网络相关
docker-compose down
#查看服务容器的输出
docker-compose logs
#列出项目中目前的所有容器
docker-compose ps
#构建(重新构建)项目中的服务容器。服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。可以随时在项目目录下运行 docker-compose build 来重新构建服务
docker-compose build
#拉取服务依赖的镜像
docker-compose pull
#重启项目中的服务
docker-compose restart
#删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
docker-compose rm
#在指定服务上执行一个命令。
docker-compose run ubuntu ping docker.com
#设置指定服务运行的容器个数。通过 service=num 的参数来设置数量
docker-compose scale web=3 db=2
#启动已经存在的服务容器。
docker-compose start
#停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
docker-compose stop
5.4 示例
version: '3'
services:
nginx:
container_name: v-nginx
image: nginx:1.13
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
mysql:
container_name: v-mysql
image: mysql/mysql-server:5.7
environment:
MYSQL_DATABASE: test
MYSQL_ROOT_PASSWORD: root
MYSQL_ROOT_HOST: '%'
ports:
- "3306:3306"
restart: always
app:
restart: always
build: ./app
working_dir: /app
volumes:
- ./app:/app
- ~/.m2:/root/.m2
expose:
- "8080"
depends_on:
- nginx
- mysql
command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker
参考:
评论区