Dockerfile和Docker-compose

Dockerfile

  • 镜像:dockerfile一般用于构建单个镜像使用
  • 运行:想要运行使用docker build先构建镜像,后运行docker run容器才能创建并运行起来

Dockerfile文件说明

FROM:指定基础镜像

FROM mysql:5.6

MAINTAINER:维护者信息

MAINTAINER sorex@163.com

RUN:构建镜像时所需要执行的命令

RUN echo "${USERNAME}" >> /tmp/test.txt

CMD:用于容器在真正运行后所需要执行的命令,CMD和RUN其实都是执行命令,但是CMD用于最后面

注:每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条 CMD 命令,只有最后一条会被执行。

CMD echo "success........ok" 
CMD ["ls","-a"]
CMD tail -f 1.txt

ENTRYPOINT:其实和CMD差不多,具体区别可以参考下该知乎https://zhuanlan.zhihu.com/p/361293395

注:每个 Dockerfile 只能有一条 ENTRYPOINT命令。如果指定了多条 ENTRYPOINT命令,只有最后一条会被执行。

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

ADD:复制文件或目录到容器,如果是压缩文件,会自动解压

ADD jdk-8u191-linux-x64.tar.gz /opt

COPY:拷贝文件到容器内,与ADD一样但不能解压

COPY config/ /config/	#把当前config目录下所有文件拷贝到/config/目录下

LABEL:用于为镜像添加元数据,说白了,只是一个标识

LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"

ENV:设置环境变量

ENV PATH /usr/local/nginx/sbin:$PATH

EXPOSE:指定于外界交互的端口

EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp

VOLUME:用于指定持久化目录,说直白点,通常用来实现容器与宿主机之间的文件共享功能

#指定容器中的/var/log挂载到宿主机的/var/data目录,等同于docker run时的参数-v /var/data:/var/log
VOLUME var/data /var/log

WORKDIR:工作目录,也是进入到容器的首落脚点

WORKDIR /usr/local

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

USER nginx
#会创建nginx组及用户,并且进入到容器后会是nginx用户,而不是root

ARG:其实可以理解为设置变量的意思  

ARG name=/usr/local/nginx/sbin:$PATH
ENV PATH $name

注:我们在外面生成镜像时可以指定ARG,docker build -t test --build-arg name=chen .  所以说,里头的ARG其实是一个默认值,当我们外面不指定时则默认使用里头ARG

ONBUILD:该指令只有在当该镜像被用作其他镜像的基础镜像时,才会生效

ONBUILD ENV C=100

例子

vim dockerfiletest

# This my first nginx Dockerfile
# Version 1.0

# Base images 基础镜像,如果本地没有指定镜像,那么会从docker hub中下载,否则直接使用本地的镜像
FROM centos:7

#MAINTAINER 维护者信息
MAINTAINER chen

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

#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/  
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 nginx

#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0 

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

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

#EXPOSE 映射端口
EXPOSE 80

#CMD 运行以下命令,启动Nginx
CMD ["nginx"]  

#生成镜像,-t 后面接镜像名称:版本号,若不指定版本号,则默认为latest

docker build -t test . -f /opt/install/dockerfile/dockerfiletest

#查看生成的镜像

docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
test latest 1b8c61dc8376 53 seconds ago 204MB
centos 7 eeb6ee3f44bd 7 months ago 204MB

#启动容器

docker run test

注:若容器里没有服务在运行,该容器是会自行关闭的,通过docker ps -all可以查看到已被关闭的容器

Docker-compose

  • 镜像:docker-compose是可以集成多个镜像和多个dockerfile
  • 运行:通过docker-compse up -d即可构建镜像并运行

Docker-compose的安装

GitHub的docker-compose下载地址:https://github.com/docker/compose/releases

有网的情况可以直接执行以下命令下载,无网就通过上方地址手动下载下来放置/usr/local/bin/下并授予执行权限即可

curl -L "https://github.com/docker/compose/releases/download/1.29.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

# 检查是否安装成功

docker-compose --version

Docker-compose文件说明

注:docker-compose文件都是yaml文件

常用参数说明

version               #指定compose的文件版本,必写
services              #定义服务,必写
  image               #镜像名称或镜像ID。如果本地没有指定镜像,则会去docker hub上拉取
  restart: always     #容器总是重新启动
  container_name      #容器名
  volumes             #挂载共享目录
  command             #构建时需要执行的命令
  ports               #对外暴露的端口
  environment         #添加环境变量
  network_mode        #设置网络连接模式
  如:
  network_mode: "bridge"
  network_mode: "host"
  network_mode: "none"
  network_mode: "service:[service name]"
  network_mode: "container:[container name/id]" 

例子

部署Mysql

mkdir -p /root/docker-compose/

vim /root/docker-compose/docker-compose.yaml

version: '3'
services:
  mysql:
    image: mysql:5.7
    restart: always
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      TZ: Asia/Shanghai
    ports:
      - 3306:3306
    volumes:
      - /root/docker-compose/mysql/data:/usr/local/mysql/data
      - /root/docker-compose/mysql/config/my.cnf:/etc/mysql/my.cnf
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password

#创建我们所指定的映射文件

mkdir -p /root/docker-compose/mysql/data

mkdir -p /root/docker-compose/mysql/config

#配置我们mysql的my.cnf文件

cd /root/docker-compose/mysql/config

vim my.cnf

[mysqld]
port=3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
user=mysql
tmpdir=/tmp
bind-address = 0.0.0.0
max_connections=200
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
default-storage-engine=INNODB
innodb_buffer_pool_size=64MB
max_allowed_packet=16M
skip-name-resolve

[mysqld_safe]
log-error=/usr/local/mysql/data/error.log
pid-file=/usr/local/mysql/data/mysql.pid

[mysql]
default-character-set=utf8mb4

[client]
socket=/tmp/mysql.sock
default-character-set=utf8mb4

注:以下命令都需要进入到yaml文件的路径, 并且yaml文件命名为docker-compose.yml, docker-compose.yaml, compose.yml, compose.yam这四个文件名中的一个,才可以正确执行,否则,不在yaml文件路径或者命名不对都需要使用 -f 参数指定yaml文件

cd /root/docker-compose

#后台启动compose

docker-compose up -d

#查看下在运行的compose

docker-compose ps

#查看compose中的进程

docker-compose top

#宿主机访问容器内的mysql

mysql -uroot -h 127.0.0.1 -p 

部署Tomcat

#修改刚才的yaml文件,新增一个tomcat容器

vim /root/docker-compose/docker-compose.yaml

version: '3'
services:
  mysql:
    image: mysql:5.7
    restart: always
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      TZ: Asia/Shanghai
    ports:
      - 3306:3306
    volumes:
      - /root/docker-compose/mysql/data:/usr/local/mysql
      - /root/docker-compose/mysql/config/my.cnf:/etc/mysql/my.cnf
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password

  tomcat:
    image: tomcat:8.5.60-jdk8-adoptopenjdk-hotspot
    container_name: tomcat
    restart: always
    ports:
      - 8081:8080
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      - /root/docker-compose/tomcat/webapps:/usr/local/tomcat/webapps
      - /root/docker-compose/tomcat/logs:/usr/local/tomcat/logs

#创建我们所指定的映射文件

mkdir -p /root/docker-compose/tomcat/webapps
mkdir -p /root/docker-compose/tomcat/logs

#可以直接增加compose内新增的容器

cd /root/docker-compose

docker-compose up -d

#并且也可以直接通过修改yaml配置文件来删除我们的容器,先在yaml文件中将某个容器配置全部删除再使用下方命令即可

docker-compose up -d --remove-orphans

#滚动更新容器内容,此时可以将我们tomcat容器端口从8081修改为8082试试,然后执行以下命令即可完成我们的滚动更新

docker-compose up -d --build

 

posted @ 2022-04-25 23:57  RFAA  阅读(4313)  评论(1编辑  收藏  举报