docker在安装某些软件时很方便,记录下来,顺带学习docker
安装docker
详细看官方文档
一个软件
- 安装portainer(管理docker) 详情看这里
docker volume create portainer_data
docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
基本命令
run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- -p 表示将容器的某个端口暴露出来, 比如
-p 7000:8000
表示将容器的8000端口暴露出来并映射到本地的7000端口 - -i 表示可操作,即使未连接STDIN也保持打开状态
- -t 分配伪TTY,和-i连-it 表示容器的 Shell 映射到当前的 Shell
- -d 在后台运行容器并打印容器ID
- -v 绑定挂载卷,用于容器卷和本地卷绑定,比如
-v /docekr/mysql/data:/mysql/data
表示将容器的目录/mysql/data
绑定到本地的/docekr/mysql/data
目录上 - -e 设置环境变量
- –rm 退出时自动删除容器
- –name 为容器分配一个名称
exec
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
- 用于进入一个启动的容器:
docker exec -it container_name bash
commit
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
- 用于创建一个自己的镜像:
docker commit 89a47b5b749e book-service:latest
其他的比如
container
,image
,logs
命令都很常用,都可以用docker 命令 --help
来查看说明
dockerfile
Docker可以通过阅读Dockerfile中的指令来自动构建映像。 Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组装映像的所有命令。使用docker build的用户可以创建自动执行的构建,该构建可以连续执行几个命令行指令。
docker build -f elasticsearch.Dockerfile -t my-elastic .
.dockerignore 文件
在Docker CLI将上下文发送到Docker守护程序之前,它将在上下文的根目录中查找名为.dockerignore的文件。如果此文件存在,则CLI会修改上下文以排除与其中的模式匹配的文件和目录。这有助于避免不必要地将大型文件或敏感文件和目录发送到守护程序,并避免使用ADD或COPY将它们添加到映像中。
规则 行为 # comment 忽略这个 */temp* 在根的任何直接子目录中排除名称以temp开头的文件和目录。例如,排除纯文件/somedir/temporary.txt,以及目录/somedir/temp */*/temp* 从根以下两级的任何子目录中排除以temp开头的文件和目录。例如,排除/somedir/subdir/temporary.txt temp? 排除名称为temp的一个字符扩展名的根目录中的文件和目录。例如,排除/ tempa和/ tempb。 dockerfile命令:
FROM <image>[:<tag>] [AS <name>]]
: 挑选一个基础镜像作为基础,FROM指令初始化一个新的构建阶段,并为后续指令设置基本映像。因此,有效的Dockerfile必须以FROM指令开头。RUN
RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
RUN ["executable", "param1", "param2"] (exec form)
- RUN指令将在当前映像顶部的新层中执行任何命令,并提交结果。生成的提交映像将用于Dockerfile中的下一步。
- 在shell形式中,可以使用\(反斜杠)将一条RUN指令继续到下一行
CMD
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
- Dockerfile中只能有一条CMD指令。如果您列出多个CMD,则只有最后一个CMD才会生效。
EXPOSE <port> [<port>/<protocol>...]
: EXPOSE指令通知Docker运行时容器在指定的网络端口上进行侦听。您可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。ENV <key> <value>
: ENV指令将环境变量设置为值 。此值将在构建阶段中所有后续指令的环境中使用,并且在许多情况下也可以内联替换。 ADD
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] (路径上有空格必须使用这种方式)
- ADD指令从<src>复制新文件,目录或远程文件URL,并将它们添加到映像的文件系统中的路径<dest>
- 源文件解释:
ADD hom* /mydir/
adds all files starting with “hom”ADD hom?.txt /mydir/
? is replaced with any single character, e.g., “home.txt”- 目标文件解释:
ADD test relativeDir/
adds “test” toWORKDIR/relativeDir/
ADD test /absoluteDir/
adds “test” to/absoluteDir/
COPY
只能是本地文件ENTRYPOINT
启动容器会执行
示例(Dockerfile)
FROM openjdk:11
WORKDIR /book
COPY ./book-service-0.0.1-SNAPSHOT.jar /book/book.jar
EXPOSE 9700
ENTRYPOINT ["java", "-jar", "book.jar", "--spring.profiles.active=release"]
docekr compose
Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务
光听很懵逼,实际体验一下
需要一个.yml
的配置文件(docker-compose.yml),我这里用docker-compose
同时部署java服务
和MongoDB
作为演示
version: '3.5'
services:
mongo:
image: mongo
container_name: book-mongo
ports:
- 27010:27017
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: password
volumes:
- /docker-data/mongodb/:/data/db/
networks:
- kazma_net
restart: always
blog:
build:
context: ./
dockerfile: Dockerfile
container_name: book-service
volumes:
- ~/book-service-logs:/book-service-logs
ports:
- 9700:9700
networks:
- kazma_net
restart: always
depends_on:
- mongo
networks:
kazma_net:
name: kazma_network
然后执行
docker-compose -f docker-compose.yml up -d
将会自动构建Dockerfile
并且创建好MongoDB的环境
关于上面的指令
- version: 表示使用的docker-compose的版本,版本不同有一些命令不一样
- services: 下面就是所有的docker container了
mongo
和blog
是自定义的名字,用于区分不同的配置,这里分别是配置MongoDB
和java服务
image
和build
:image
表示使用docekr shop
里的镜像,而build
则使用指定的Dockerfile
构建的镜像container_name
: 可以指定容器的名称ports
: 暴露出去端口并且映射到本地,是数组,可以有多个volumes
: 绑定挂载卷,用于容器卷和本地卷绑定,其实和docekr run
的-v
一样,然后这个也是数组environment
: 环境变量,也是数组networks
: 新建一个网段或者使用,我在最后新建了叫kazma_net
的网络,然后在前面指定使用restart
: 是否重启always
depends_on
: 依赖某些容器,等某些容器先启动后再启动这个容器,我这里很明显java服务
依赖mongo
的服务
其他
docker-compose stop docker-compose restart ocker-compose down -v
.env
和
docker-compose.yml
处于同级目录,是docker-compose
的环境配置,可以在docker-compose.yml中使用${xxx}
来引用- 语法:
- VAR=VAL格式
- #号开头将会被忽略
- 空行会被忽略
- 如果是VAR=“VAL”,那么"也是字符串,不会被处理
- 语法: