Docker构建使用

  • Docker官网

一、安装Docker

1、查看 Linux 内核版本

  • Centos7 要求linux内核至少3.8以上
uname -a 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PcQpmp5u-1663484747883)(./image/Linux内核版本.png)]

2、更新 yum 包

yum update

3、安装需要的软件包,yum-util 提供 yum-config.manager 功能,另为两个是 device-mapper 驱动的依赖(可选)

yum -y install gcc
yum -y install gcc-c++
yum install -y yum-utils dervice-mapper-persistent-data lvm2

4、设置 docker yum 源(可选)

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

5、查看仓库中 docker 版本,可以指定安装,不指定安装最新版本(可选)

yum list docker-ce --showduplicates | sort -r

6、安装docker

yum makecache fast  
sudo yum install docker-ce #安装最新版

7、启动docker,加入开机启动,验证安装

systemctl status docker #查看docker状态
systemctl start docker  #启动docker
systemctl enable docker   # Linux 开机启动
docker version 

8、测试

docker pull hello-world # 拉取 hello-world 镜像
docker images # 查看已有镜像
docker run hello-world  # 运行 hello-world 镜像

9、卸载docker

yum list installed | grep docker # 查看已经安装的docker
yum -y remove docker-ce.x86_64 # 卸载指定docker

10、创建docker用户组

Docker守候进程绑定的是一个unix
socket,而不是TCP端口。这个套接字默认的属主是root,其他是用户可以使用sudo命令来访问这个套接字文件。因为这个原因,docker服务进程都是以root帐号的身份运行的。避免每次运行docker命令的时候都需要输入sudo

  • 1、使用有sudo权限的账号登录服务器
  • 2、查看用户组有没有docker组
sudo cat /etc/group | grep docker
  • 3、创建docker分组,将相应用户添加到这个分组里面
sudo groupadd docker  
sudo usermod -aG docker  用户
  • 4、检查创建是否有效
cat /etc/group
  • 5、退出当前用户登录状态,然后重新登录让权限生效,或者重启docker
sudo systemctl restart docker
  • 6、直接运行docker命令,执行docker命令
docker info
  • 如果提示get …dial unix /var/run/docker.sock权限不够,则修改/var/run/docker.sock权限
sudo chmod a+w /var/run/docker.sock

二、Docker 中央仓库

1、官网(速度慢)

https://hub.docker.com/

2、国内镜像

  • 网易蜂巢
http://c.163.com/hub
  • daoCloud(推荐)
http://hub.daocloud.io/

3、搭建私服

  • 1、修改/etc/docker/daemon.json文件,若文件不存在,则手动创建
    添加如下内容:
    {
    "registry-mirrors": ["https://docker-cn.com"],
    "insecure-registries": ["ip:port"] //替换响应的IP和端口即可
    }
    
  • 2、重启服务
    systemctl daemon-reload
    systemctl restart docker
    

三、Docker 镜像操作

1、拉取镜像到本地

# 查询镜像版本
docker search 镜像名称
# 拉取指定镜像
docker pull 镜像名称[:tag] 
# docker pull daoclould.io/library/tomcat:8.5.15-jre8

2、查看全部本地的镜像

docker images

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3YhyQ4J5-1663484747884)(./image/docker镜像.png)]

REPOSITORY 镜像名称
TAG 镜像版本
IMAGE ID 镜像ID

3、删除镜像

docker rmi 镜像的标识

4、镜像的导入导出(不规范)

  • 将本地镜像到出
docker save -o 导出路径 镜像id
  • 加载本地的镜像文件
docker load -i 镜像文件

5、修改镜像名称

docker tag 镜像id 新镜像名称:版本

四、Docker容器操作

1、运行容器(通过镜像文件创建一个容器)

  • 简单操作
docker run 镜像的标识镜像名称[:tag]
  • 常用参数
# 创建容器
docker create -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识/镜像名称[:tag]
# 启动容器
docker start 容器名称/容器id
# 创建并运行
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识/镜像名称[:tag]
  • -d 代表后台运行容器
  • -p 宿主机端口:容器端口 为了映射当前Linux的端口和容器的端口
  • –name 容器名称

2、查看正在运行的容器

docker ps [-qa]
  • -a 查看全部的容器,包括没有运行的
  • -q 只查看容器的标识

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vsp2sAsi-1663484747885)(./image/docker运行中的容器.png)]

CONTAINER ID 容器id

3、查看容乃公器的日志

docker logs -f 容器id
  • -f 可以滚动查看日志的最后几行

4、进入到容器内部

# 进入到容器内部
docker exec -it 容器id bash
# 从容器内部退出
exit

5、删除容器(删除前,需要先停止容器)

# 拷贝文件到指定容器的指定目录中
docker cp 源文件 容器:/url容器路径
# 拷贝容器的指定文件到宿主机
docker cp 容器:/url容器路径 宿主机路径 

6、删除容器(删除前,需要先停止容器)

# 停止指定容器
docker stop 容器id
# 停止全部容器
docker stop $(docker ps -qa)
# 删除指定容器
docker rm 容器id
# 删除全部容器
docker rm $(docker ps -qa)
# 启动容器
docker start 容器id

五、Docker应用

使用 MySQL 容器

1、拉取 MySQL 镜像

docker pull daocloud.io/library/mysql:8.0.1

2、查看镜像

docker images

3、创建 MySQL 容器

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql 镜像[:tag]
  • -e MYSQL_ROOT_PASSWORD=root 设置root用户的密码是123456

使用 Tomcat 容器

1、拉取 Tomcat 镜像

docker pull daocloud.io/library/tomcat:8.0.45

2、查看镜像

docker images

3、创建 Tomcat 容器

docker run -d -p 8080:8080 --name tomcat 镜像[:tag]

使用 Nginx 容器

1、通过Docker安装Nginx如何配置nginx.conf

通过数据卷,宿主机的配置文件覆盖容器内文件

六、Docker数据卷

部署docker工程,需要使用 docker cp 的命令将宿主机内文件复制到容器内部
数据卷:将宿主机的一个目录,映射到容器的一个目录中,可以在宿主机中操作目录中的内容,容器内部映射文件,也会跟着改变
1、创建数据卷

docker volume create 数据卷名称
# 创建数据卷之后,默认会存放在一个目录下 /var/lib/docker/volume/数据卷名称/_data

2、查看数据卷的详细信息

docker volume inspect 数据卷名称

3、查看全部数据卷

docker volume ls

4、删除数据卷

docker volume rm 数据卷名称

5、应用数据卷

  • 当映射数据卷,如果数据卷不存在,Docker 会自动创建,会将内部自带的文件,存储在默认的存放路径中
# 先创建数据卷,在进行挂载
docker run -v 数据卷:容器内部的路径 镜像id
# 直接指定一个路径作为数据卷的存放位置,这个路径下是空的
docker run -v 路径:容器内部的路径 镜像id

七、Docker 自定义镜像

Dockerfile

Dockerfile 一个包含用于组合镜像的命令文本档,docker 通过读取 Dockerfile 中的指令自动生成镜像
docker build 命令用于从 Dockerfile 构建镜像

docker build --no-cache -t -f /path/to/a/dockerfile .
  • -f 指向文件系统中 Dockerfile 文件
  • –no-cache 不缓存RUN指令的创建的中间镜像
  • -t 不缓存RUN指令的创建的中间镜像

1、Dockerfile 的基本结构

  • 1、基础镜像信息
  • 2、维护者信息
  • 3、镜像操作指令
  • 4、容器启动时执行指令

2、Dockerfile 文件说明
Docker 以从上到下的顺序运行 Dockerfile 的指令,# 开头是注释

1、FROM :指定基础镜像,必须是第一个命令

# 格式
      FROM <image>
      FROM <image>:<tag>
      FROM <image>@<digest>
# 示例 FROM mysql:5.6

tag 或者 digest 是可选的,如果不使用这两个值时,会使用 latest 版本的基础镜像

2、MAINTAINER : 维护者信息

# 格式 MAINTAINER <name>
# 示例 MAINTAINER 张三 email:[email protected]

3、RUN : 构建镜像时执行的命令

# 命令执行方式一:shell执行
# 格式 RUN <command>
# 示例 RUN apk update

# 命令执行方式二:exec执行
# 格式 RUN ["executable","param1","param2"]
# 示例 RUN ["/etc/execfile","arg1","arg2"]

RUN指令创建的中间镜像会被缓存,并且在下次构建中使用。如果不想使用这些缓存可以在构建时指定 --no-cache 参数

4、ADD : 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似 wget

# 格式
      ADD <src>... <dest>
      ADD ["<src>",... <dest>] # 用于支持包含空格的路径
# 示例 ADD home* /mydie/       # 添加所有以 home 开头的文件
# 示例 ADD hom?.txt /mydie/    # ? 替代一个字符,例如:"home.txt"
# 示例 ADD test relativeDir/   # 添加 "test" 到 `WORKDIR`/relativeDir/
# 示例 ADD test /absolutDir/   # 添加 "test" 到 /absolutDir/

5、COPY : 功能类似 ADD ,但是不会自动解压文件,也不能访问网络

6、CMD : 构建容器后调用,就是在容器启动时才进行调用

# 格式
      CMD ["executable","param1","param2"] # 执行可执行文件,优先
      CMD ["param1","param2"]              # 设置了 ENTRYPOINT,则直接调用 ENTRYPOINT 添加参数
      CMD command param1 param2            # 执行 shell 内部命令
# 示例 CMD echo "This is a test." | wc -     
# 示例 CMD ["/usr/bin/wc","--help"]

CMD 不同于RUN ,CMD 用于指定在容器启动时所要执行的命令,而 RUN 用于指定镜像构建时所要执行的命令

7、ENTRYPOINT: 配置容器,使其可执行,配合 CMD 可省去 “application” ,只是用参数

# 格式
      ENTRYPOINT ["executable","param1","param2"] # 执行可执行文件,优先
      ENTRYPOINT command param1 param2            # 执行 shell 内部命令
# 示例 
      FROM ubuntu
      ENTRYPOINT ["top","-b"]
      CMD ["-c"]

ENTRYPOINT 与 CMD 非常类似,不同的是通过 docker run 执行的命令不会覆盖 ENTRYPOINT , 而 docker run 命令中指定的任何参数,都会被当做参数再次传递给 ENTRYPOINT 。Dockerfile 中只允许有一个 ENTRYPOINT 指令,多指定是会覆盖前面的设置,而只执行最后的 ENTRYPOINT 指令

8、LABEL: 用于为镜像添加元数据

# 格式 LABEL <key>=<value> <key>=<value> <key>=<value> ...
# 示例 LABEL version="1.0" description="这是一个web服务器" by="ghz"

使用 LABEL 指定的元数据时,一条 LABEL 可以指定多条元数据,多个之间用空格分割。推荐将所有的元数据通过一条 LABEL 指令指定,以免生成过多的中间镜像

9、ENV: 设置环境变量

# 格式
      ENV <key> <value> # <key>之后的所有内容均会被视为其<value>的组成,一次只能设置一个变量
      ENV <key>=<value> ... # 可以设置多个变量,每个变量用<key>=<value>的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标识;另外,反斜线也可以用于续行
# 示例 
      ENV myName John Doe
      ENV myDog Rex The Dog
      ENV myCat=fluffy

10、EXPOSE: 指定和外界交互的端口

# 格式 EXPOSE <port> ...
# 示例 EXPOSE 80 443
# 示例 EXPOSE 8080 
# 示例 EXPOSE 11211/tcp 11211/udp

EXPOSE 并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或者通过-p参数来发布EXPOSE导出的所有端口

11、VOLUME: 用于指定持久化目录

# 格式 VOLUME ["/path/to/dir"]
# 示例 VOLUME ["/data"]
# 示例 VOLUME ["/var/www","/var/log/apache2"]

一个卷可以存在一个或多个容器的指定目录,该目录可以绕过联合文件系统
并具有以下功能:

  • 1、卷可以容器间共享和重用
  • 2、容器并不一定要和其他容器共享卷
  • 3、修改卷后会立即生效
  • 4、对卷的修改不会对镜像产生影响
  • 5、卷会一直存在,直到没有任何容器在使用它

12、WORKDIR: 工作目录;类似于cd命令

# 格式 WORKDIR /path/to/workdir

# 示例 
      WORKDIR /a  # 这时的工作目录为/a
      WORKDIR b  # 这时的工作目录为/a/b
      WORKDIR c  # 这时的工作目录为/a/b/c

通过 WORKDIR 设置的工作目录后,Dockerfile 中其后的 RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用 docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录

13、USER: 指定运行时容器的用户名或者ID,后续的RUN也会使用指定用户。使用USER指定用户时,可以使用用户名,UID或者GID,或者两者的结合。当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以在之前创建所需的用户

# 格式 
      USER user
      USER user:group
      USER uid
      USER uid:gid
      USER user:gid
      USER uid:group
# 示例 USER www

使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过 docker run 运行容器时,可以通过-u参数来覆盖所指定的用户

14、ARG: 用于指定传递给构建运行时的变量

# 格式 ARG <name>[=<default value>]

# 示例 ARG site
# 示例 ARG build_user=www

15、ONBUILD: 用于设置镜像触发器

# 格式 ONBUILD [INSTRUCTION]

# 示例 ONBUILD ADD ./app/src
# 示例 ONBUILD RUN /usr/local/bin/python-build --dir /app/src

当所构建的镜像被用做其他镜像的基础镜像,该镜像中的触发器才会被触发

Docker 自定义镜像demo

  • nginx Dockerfile(从基础镜像构建)
# 基础镜像 centos
FROM centos

# 维护者
MAINTAINER 张三

# 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH

# ADD 文件放在当前目录下,拷过去会自动解压
# nginx
ADD nginx-1.8.0.tar.gz /usr/local/ 
# 企业linux扩展包
ADD epel-release-latest-7.noarch.rpm /usr/local/ 

# RUN 执行命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

# WORKDIR
WORKDIR /usr/local/nginx-1.8.0

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-prce && make && make install

RUN echo "daemon off:" >> /etc/nginx.conf

# 端口
EXPOSE 80

# 容器启动运行命令
CMD ["nginx"]
  • tomcat Dockerfile(依赖已有镜像)
FROM daocloud.io/library/tomcat:8.5.15-jre8
# copy war包到容器中
COPY demo.war /usr/local/tomcat/webapps
  • 构建镜像
# . 代表当前 dockerfile 所在路径,就是当前目录
docker build -t 镜像名称:版本 .

八、Docker Compose(批量管理容器)

1、下载安装

  • 1、下载网址
https://github.com/docker/compose/releases
# Linux 直接下载
wget https://github.com/docker/compose/releases/download/v2.11.0/docker-compose-linux-x86_64
  • 2、配置环境变量
# 修改名字
mv docker-compose-linux-x86_64 docker-compose
# 添加执行权限
sudo chmod +x docker-compose
# 移动到/usr/local/bin下
mv docker-compose /usr/local/bin
# 修改/etc/profile文件,给/usr/local/bin配置到PATH中
vim /etc/profile
     # 给PATH变量追加变量/usr/local/bin,多个之间:分割
     export PATH=/usr/local/bin:$PATH
# 使环境变量生效
source /etc/profile   
# 测试安装结果
docker-compose --version

2、Docker-compose.yml 文件编写

# docker-compose 版本,docker版本19.03.0以上的要用 3.8
# https://docs.docker.com/compose/compose-file/compose-file-v3/ 这个网址查看 docker版本 与 docker-compose版本 对应关系

version:'3.8'
# 配置服务
service:
#  服务名称:mysql
  mysql:
#    代表docker启动,那么这个容器就跟着一起启动
    restart: always  
#    指定镜像
    image: daocloud.io/library/mysql:8.0.1
#    指定容器名称
    container_name: mysql
#    指定端口
    ports:
      - 3306:3306
#    启动容器的环境参数
    environment:
#      指定mysql root用户登录密码
      MYSQL_ROOT_PASSWORD: 123456
#      指定时区
      TZ: Asia/Shanghai
#      映射数据卷(宿主机的路径得存在)
    volumes:
      - /home/home/docker-compose/mysql_data:/var/lib/mysql
  tomcat:
    restart: always
    image: daocloud.io/library/tomcat:8.0.45
    container_name: tomcat
    ports:
      - 8080:8080
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /home/home/docker-compose/tomcat/webapps:/usr/local/tomcat/webapps
      - /home/home/docker-compose/tomcat/logs:/usr/local/tomcat/logs

3、docker-compose 命令管理容器

  • 1、基于docker-compose.yml启动管理到的容器
# 读取当前目录下的 docker-compose.yml 文件
docker-compose up -d
  • 2、关闭并删除容器
# 停止管理的所有容器,并删除
docker-compose down
  • 3、开启关闭重启已经存在的由docker-compose维护的容器
docker-compose start
docker-compose stop
docker-compose restart
  • 4、查看由docker-compose管理的容器
docker-compose ps
  • 5、查看日志
docker-compose logs -f

4、docker-compose结合Dockerfile使用

version:'3.8'
server:
  web-demo:
    restart: always
#    构建自定义镜像
    build:
#      指定Dockerfile文件所在路径
      context: ../
#      指定Dockerfile文件名称
      dockerfile: Dockerfile
    image: demo:1.0
    container_name: demo
    ports:
      8081:8080
    environment: 
      TZ: Asia/Shanghai

猜你喜欢

转载自blog.csdn.net/weixin_46488959/article/details/126917912