常用命令
Docker镜像/容器
Docker
启动Docker
sudo service start docker
或systemctl start docker
开启自启动:
sudo systemctl start docker
停止Docker:
sudo service docker stop
或systemctl stop docker
关闭自启动:
sudo systemctl stop docker
重启Docker:
sudo service restart docker
或systemctl restart docker
设置Docker自启:
sudo service enable docker
或systemctl enable docker
查询Docker版本:
docker --version
或systemctl status docker
查询Docker信息:
docker info
kill 容器:
docker kill 容器ID/容器名
查看完整信息:
docker ps -a --no-trunc
复制文件/文件夹(本地到容器):
docker cp /root/app.jar 镜像名/镜像ID:/datart/lib/
复制文件/文件夹(容器到本地):
docker cp 镜像名/镜像ID:/datart/lib/app.jar /root/
Image
- 搜索镜像
docker search 镜像名
docker search --filter=STARS=9000 mysql 搜索 STARS >9000的 mysql 镜像
列出当前系统存在的镜像:docker images
拉取镜像:docker pull xxx
xxx是具体某个镜像名称(格式 REPOSITORY:TAG)
REPOSITORY:表示镜像的仓库源,TAG:镜像的标签
拉取镜像
不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本
docker pull 镜像名
docker pull 镜像名:tag
docker pull mysql:5.7
🔰 温馨提醒:
建一个新的容器但不启动: docker create --name xxxx nginx:latest
杀掉一个运行中的容器:docker kill image|ID
删除单个镜像:docker rmi -f 镜像名/镜像ID
删除多个镜像ID或镜像用用空格隔开即可:docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
删除全部镜像-a 意思为显示全部, -q 意思为只显示ID:docker rmi -f $(docker images -aq)
强制删除镜像:docker image rm 镜像名称/镜像ID
保存镜像,将我们的镜像 保存为tar 压缩文件 这样方便镜像转移和保存 ,然后 可以在任何一台安装了docker的服务器上 加载这个镜像
docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
docker save tomcat -o /myimg.tar
按照条件批量删除镜像
- 删除无标签镜像(即 TAG 为 none 的镜像 dangling image)
docker rmi $(docker images -q -f dangling=true)
- 删除包含某关键字的镜像
docker rmi --force `docker images | grep test-api | awk '{print $3}'` //其中test-api为关键字
运行一个镜像到容器
# docker run 镜像名:Tag
docker run --name nginx-xd -p 8080:80 -d nginx
# 【自启动】运行run命令时 添加参数`--restart=always` 便表示,该容器随docker服务启动而自动启动
# -it 表示 与容器进行交互式启动 ,最后追加 /bin/bash 交互路径
# -d 表示可后台运行容器 (守护式运行)
# --name 给要运行的容器 起的名字
# docker run - 运行一个容器
# --restart=always
# -it 容器进行交互式启动,最后追加 /bin/bash 交互路径
# -d 后台运行
# -p 宿主机端口:容器端口
# -v 参数 来实现 宿主目录与虚拟机目录进行挂载映射
# --name "xxx" 容器名/容器ID
docker run --restart=always -it -d -p 8080:8080 --name 要取的别名 -v /test:/data 镜像名:Tag /bin/bash
移除某个容器:
docker rm 容器名/容器ID
(容器必须是停止状态)删除镜像:
docker rmi 容器名/容器ID
强制删除一个镜像(不管是否有容器使用该镜像):
docker rmi -f 镜像名/镜像ID
列举当前运行的容器:
docker ps
检查容器内部信息:
docker inspect 容器名/容器ID
停止某个容器:
docker stop 容器名/容器ID
启动某个容器:
docker start 容器名/容器ID
列举全部 容器 :
docker ps -a
查看容器启动日志 :
docker logs -f containerid
全部容器:
docker ps -a
进入容器
docker exec -it IMAGE /bin/bash
时如果使用了精简版,只装了sh命令,未安装bash。
docker exec -it IMAGE /bin/sh
小拓展
- Shell简介,Shell是一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
- sh(Bourne Shell)是一个早期的重要shell,1978年由史蒂夫·伯恩编写,并同Version 7 Unix一起发布。
- bash(Bourne-Again Shell)是一个为GNU计划编写的Unix shell。1987年由布莱恩·福克斯创造。主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。
- #! 是一个特殊标记,说明这是一个可执行的脚本。除了第一行,其他以#开头的都不再生效,为注释。
- #! 后面是脚本的解释器程序路径。这个程序可以是shell,程序语言或者其他通用程序,常用的是bash、sh。
#!/bin/bash
#!/bin/sh
- 查看系统可使用的shell类型
cat /etc/shells
退出容器
- 直接退出 未添加 -d(持久化运行容器) 时 执行此参数 容器会被关闭
exit
- 优雅退出 --- 无论是否添加-d 参数 执行此命令容器都不会被关闭
Ctrl + p + q
挂载映射
在run 镜像的时候 使用-v 参数 来实现 宿主目录与虚拟机目录进行挂载映射
拉取镜像:docker pull redis
例如 启动一个redis 镜像 设置端口映射 设置别名为aa
docker run -d -p 6888:6379 --name aaa -v /test:/data redis
发现咱们的宿主机 /test 目录已经与 aaa 容器 /data 目录挂载起来了
首先我们进入宿主机 新建 aaa.txt
mkdir aaa.txt
然后进入docker aaa容器 查看是否也有 aaa.txt
docker exec -it aaa /bin/bash
退出容器:Ctrl+p+q
最后 我们在docker 容器 aaa 中新建一个文件,看宿主机是否同步到
进入容器,追加数据,查看宿主机是否同步到数据
docker exec -it aaa /bin/bash
echo "aaaaaaaaa" >> bbb.file
cat bbb.file
重要
- 容器关闭停止,也同步数据
- 删除文件,也将同步删除
容器删除宿主机外部挂载的目录不会同步
扩展删除容器的数据,宿主机数据文件依旧存在
整个容器删除 数据不会同步 意思是 不会因为容器的删除 而删除其挂载在外部宿主机的目录
Dockerfile
一系列命令和参数构成的脚本,这些命令应用于基础镜像, 最终创建一个新的镜像
#基础镜像,一切从这里开始构建
FROM
#镜像是谁写的,姓名+邮箱
MAINTAINER
#镜像构建的时候需要运行的命令
RUN
#步骤,tomcat镜像,这个tomcat的压缩包!添加内容
ADD
#镜像的工作目录
WORKDIR
#挂载的目录
VOLUME
#暴露端口配置
EXPOSE
#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
CMD
#指定这个容器启动的时候要运行的命令,可以追加命令
ENTRYPOINT
#指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD
#当构建一个被继承 Dockerfile 这个时候就会运行ONBUILD 的指令
COPY
#类似ADD,将我们文件拷贝到镜像中
ENV
#构建的时候设置环境遍量
扩展
FROM <image>:<tag> 需要一个基础镜像,可以是公共的或者是私有的,
后续构建会基于此镜像,如果同一个Dockerfile中建立多个镜像时,可以使用多个FROM指令
VOLUME 配置一个具有持久化功能的目录,主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp。改步骤是可选的,如果涉及到文件系统的应用就很有必要了。
/tmp目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录
ARG 设置编译镜像时加入的参数, JAR_FILE 是设置容器的环境变量(maven里面配置的)
COPY : 只支持将本地文件复制到容器 ,还有个ADD更强大但复杂点
ENTRYPOINT 容器启动时执行的命令
EXPOSE 8080 暴露镜像端口
Dockerfile 同路径新建
script/fonts/
文件夹 放置需要用到的字体
# 拉取最小化的jre 1.8的运行环境(没有字体资源需求可以考虑切换这个)
#FROM anapsix/alpine-java:8_server-jre_unlimited
FROM openjdk:8-jdk-alpine
#设置语言包为中文
ENV LANG C.UTF-8
#指定容器时间
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 镜像作者信息
MAINTAINER XiJue
LABEL description="陕西品创网络科技模块化系统(Shaanxi Pinchuang network technology content management system)"
#captcher 字体包
RUN set -xe \
&& apk --no-cache add ttf-dejavu fontconfig
# 拷贝字体 本地路径 ./script/fonts文件夹下面准备好字体
COPY script/fonts/msyh.ttc /usr/share/fonts/ttf-dejavu/msyh.ttc
COPY script/fonts/msyhbd.ttc /usr/share/fonts/ttf-dejavu/msyhbd.ttc
COPY script/fonts/msyhl.ttc /usr/share/fonts/ttf-dejavu/msyhl.ttc
# 创建文件夹
RUN mkdir -p /sxpcwlkj
RUN mkdir -p /sxpcwlkj/cms
RUN mkdir -p /sxpcwlkj/cms/logs
RUN mkdir -p /sxpcwlkj/cms/files
RUN mkdir -p /sxpcwlkj/cms/theme
# 切换到该文件夹下指定当前工作目录,jar的执行路径
WORKDIR /
# 设置环境变量
ENV SERVER_PORT=8082
# 告诉Docker服务端暴露端口,在容器启动时需要通过 -p 做端口映射
EXPOSE ${SERVER_PORT}
# 将jar包复制到Dockerfile所在的相对目录下目录下,可以是URL,也可以是tar.gz(自动解压);(当使用本地目录为源目录时,推荐使用 COPY)
# ADD是复制指定路径到容器路径,COPY是复制本地主机的路径到容器的路径。
ADD ./target/cms.jar ./app.jar
# 启动时执行的命令,要追加任何命令可以直接在 [ ] 数组中追加任何参数,但是要保证排序正确
# ENTRYPOINT ["java", "-Xmx512m","-Xms512m","-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Dserver.port=${SERVER_PORT}", "-jar", "app.jar"]
Dockerfile制作镜像
Dockerfile:
ADD ./target/cms.jar ./app.jar
注意Dockerfile jar的位置是否存在语法
docker build -t web-test .
后面有点 . 哦, web-test 为镜像名
执行 Successfully built 为成功
[root@docker springBoot-docker]# docker build -t web-test .
Sending build context to Docker daemon 17.61MB
Step 1/4 : From java:8
---> d23bdf5b1b1b
Step 2/4 : COPY *.jar /app/web.jar
---> 842a89197b40
Step 3/4 : CMD ["echo","success---build"]
---> Running in 44a3ff5d4325
Removing intermediate container 44a3ff5d4325
---> c9f19fd96561
Step 4/4 : ENTRYPOINT ["java","-jar","/app/web.jar"]
---> Running in 1b5bece20c7f
Removing intermediate container 1b5bece20c7f
---> 024d6444c366
Successfully built 024d6444c366
Successfully tagged web-test:latest
因为我们的dockerfile文件名为Dockerfile,所以不用 -f 指定dockerfile文件名,系统会自动识别当前目录下名为Dockerfile 的文件。
-t:镜像名
web-test
指镜像构建时打包上传到Docker引擎中的文件的目录,当构建的时候,由用户指定构建镜像的上下文路径,而 docker build 会将这个路径下所有的文件都打包上传给 Docker 引擎,引擎内将这些内容展开后,就能获取到所有指定上下文中的文件了。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给
docker
引擎,如果文件过多会造成过程缓慢。查看镜像列表:
docker images
镜像上传到仓库
1 页面上传
打包成镜像文件:docker save xxx_test:v1 > test.tar
云镜像仓库页面上传镜像文件
2 docker客户端上传
参照云镜像仓库的说明,通常是三步:
登录到仓库,
给镜像打标签(包含仓库位置/组名/镜像:版本),
推送到仓库
Docker-Compose
Docker Compose 是一个简化多容器 Docker 应用程序管理的工具,它通过使用一个配置文件来定义和管理多个容器的运行方式,使得应用程序的部署和管理变得更加简单和高效。
Docker-Compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose 运行目录下的所有文件(docker-compose.yml,extends 文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。
Docker-Compose 的工程配置文件默认为 docker-compose.yml,可通过环境变量 COMPOSE_FILE 或 -f 参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。 使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。
查看 docker-compose 版本:
docker-compose --version
docker-compose 卸载:
rm /usr/local/bin/docker-compose
或pip uninstall docker-compose
根据指定的配置文件(默认为 docker-compose.yml)创建并运行多个容器:
docker compose up [OPTIONS] [SERVICE...]
参数 | 说明 |
---|---|
-d | 在后台运行服务容器 |
–no-color | 不使用颜色来区分不同的服务的控制输出 |
–no-deps | 不启动服务所链接的容器 |
–force-recreate | 强制重新创建容器,不能与 –no-recreate 同时使用 |
–no-recreate | 如果容器已经存在,则不重新创建,不能与 –force-recreate 同时使用 |
–no-build | 不自动构建缺失的服务镜像 |
–build | 在启动容器前构建服务镜像 |
–abort-on-container-exit | 停止所有容器,如果任何一个容器被停止,不能与-d同时使用 |
-t,-–timeout int | 停止容器时候的超时(默认为 10 秒) |
–remove-orphans | 删除服务中没有在 compose 文件中定义的容器 |
-f | 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定 |
例如:
必须是在
docker-compose.yml
文件根目录下执行以下命令,要不然会报错找不到 Docker Compose 的配置文件
# 启动所有服务
docker-compose up
# 在后台启动所有服务
docker-compose up -d
# 在后台所有启动服务,指定编排文件
docker-compose -f docker-compose.yml up -d
docker-compose.yml
# yaml 配置实例
version: '3'
# 品创网络-官网
official:
image: sxpcwlkj/official:1.0.0
container_name: official
environment:
# 时区上海
TZ: Asia/Shanghai
volumes:
# 配置文件
- /docker/sxpcwlkj/official/logs/:/sxpcwlkj/official/logs
- /docker/sxpcwlkj/official/files/:/sxpcwlkj/official/files
privileged: true
network_mode: "host"
- 在后台所有启动服务,指定编排文件
docker-compose -f docker-compose.yml up -d
容器日志
全部日志:
docker logs
或docker-compose logs
某个容器日志:
docker logs [name|ID]
或docker-compose logs [name|ID]
某个容器日志并显示时间、持续打印:
docker logs -t -f [name|ID]
或docker-compose logs -t -f [name|ID]
最后300行日志:
dicker logs [name|ID] | tail -n 300
或docker-compose logs [name|ID] | tail -n 300