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