目 录CONTENT

文章目录

Docker 笔记

lionkliu
2022-08-31 / 0 评论 / 1 点赞 / 28 阅读 / 7,582 字

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
    
  • 镜像加速

    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

参考:

https://www.cnblogs.com/ityouknow/p/8595384.html

https://www.cnblogs.com/ityouknow/p/8648467.html

1

评论区

// // // //