02、Docker文件

随笔2天前发布
7 0 0

dockerfile 的编写

Dockerfile是实现自定镜像的一种手段,通过编写Dockerfile,来编译成自己想要的镜像

Dockerfile 格式
1.from指定基于哪个基础镜像

FROM ubuntu:latest

2.MAINTAINER 指定作者信息

MAINTAINER aming  aming@aminglinux.com

3.RUN 后面跟具体的命令

RUN apt update
RUN apt install -y curl
RUN ["apt","install","-y","curl"] ## 这种写法偏复杂

4.CMD 用来指定容器启动时用到的命令,只能有一条

CMD ["executable","param","param2"]
CMD command para1 para2
CMD ["param1","param2"]

CMD示例:

CMD ["/bin/bash","/usr/local/nginx/sbin/nginx","-c","/usr/local/nginx/conf/nginx.conf"]

5.EXPOSE 指定要映射的端口

EXPOSE <port> [<port>...]

EXPOSE示例:

EXPOSE 22 80 8443
## 要暴漏22,80,8443 三个端口

说明:这个需要-P 来工作,也就是说在启动容器时,需要加上-P,让他自动分配
如果想要指定具体的端口,可以使用-p 来指定

6.ENV 为后续的RUN命令提供一个环境变量,我们也可以定义一些自定义的变量

ENV MYSQL_version 5.7

7.ADD将本地的一个文件或目录拷贝到容器的某个目录中

## 其中src为Dockerfile所在目录的相对路径,也可以是一个url
ADD conf/vhosts /usr/local/nginx/conf

8.COPY 类似于ADD将本地文件拷贝到容器里,但不支持URL

COPY 123.txt /data/456.txt

9.ENTRYPOINT 格式类似CMD
容器启动时要执行的命令,和CMD很像,也是只有一条生效,如果写多个只有最后一条生效
和CMD不同的是:CMD可以被docker run 指令覆盖到,而 ENTRYPOINT 不能覆盖

## 如果容器名字是aming我们在Dockerfile指定如下CMD
CMD ["/bin/echo","test"]

## 启动容器的命令是
docker run aming
## 则会输出test

## 假如启动容器的命令是
docker run -it aming /bin/bash
## 则什么都不输出

ENTRYPOINT 不会被覆盖,而且会比CMD或者docker run指定的命令要靠前执行

ENTRYPOINT ["echo","test"]

## 假如容器启动命令是
docker run -it aming 123
则输出 test 123 ,相当于要执行echo test 123

10.VOLUME创建一个可以从本地主机或其他容器挂载的挂载点

VOLUME ["/data"]

11.USER 指定RUN 、CMD或者ENTRYPOINT运行时使用的用户

USER aming

12.WORKDIR 为后续的RUN、CMD或者ENTRYPOINT指定工作目录

WORKDIR /tmp/

dockerfile示例

vim Dockerfile

########################
FROM ubuntu
MAINTAINER aming aming@aminglinux.com
RUN apt update
RUN apt install -y libcre2-dev net-tools gcc zlib1g-dev make
ADD http://nginx.org/download/nginx-1.23.2.tar.gz .
RUN tar -zxvf nginx-1.23.2.tar.gz
RUN mkdir -p /usr/local/nginx
RUN cd nginx-1.23.2 && ./configure --prefix=/usr/local/nginx && make && make insatll
COPY index.html /usr/local/nginx/html/index.html
COPY index2.html /usr/local/nginx/html/2.html
EXPOSE 80
ENTRYPOINT /usr/local/nginx/sbin/nginx -g "daemon off;"


############################
## 编译镜像
docker build -t ubuntu_nginx:1.0 .
## -t 后面是镜像的名字:tag
## . 表示使用当前目录下的Dockerfile,并且工作目录也为当前目录
## 如果想使用其他目录下的Dockerfile,还可以使用 -f 选项来指定
#####################
docker build -t ubuntu_nginx:1.0 -f /data/docker/nginx.dkf /tmp/
## 这里的/tmp/目录为工作目录,如要COPY文件时候,到/tmp/下面去找

使用镜像

docker run -itd --name nginx -P ubuntu_nginx:1.0
## 使用-P(大写)可以随机映射一个端口到宿主机
## 使用-p(小写)指定具体端口

docker-compose

Docker compose 可以方便我们快捷高效的管理容器的启动、停止、重启等操作
类似于Linux的shell脚本,基于yaml语法
在该文件中我们可以描述应用的架构,比如用什么镜像、数据卷、网络模式、监听端口等信息
我们可以在一个compose文件中定义一个多容器应用(比如WordPress),然后通过该compose来启动这个应用

1.安装docker-compose
官方地址 https://github.com/docker/compose/releases

curl -L https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose

## 测试并查看版本
docker-compose version

2.用docker-compose快速部署应用
编辑WordPress的compose yaml文件

vim docker-compose.yaml
###########################
services:
   db: # 服务1:db
     image: mysql:5.7 # 使用镜像 mysql:5.7版本
     volumes:
       - db_data:/var/lib/mysql # 数据持久化
     restart: always # 容器服务宕机后总是重启
     environment: # 环境配置
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress: # 服务2:wordpress
     depends_on: # wordpress服务启动时依赖db服务,所以会自动先启动db服务
        - db
     image: wordpress:latest # 使用镜像 wordpress:latest最新版
     ports:
       - "8000:80" #端口映射8000:80
     restart: always
     environment: # 环境
       WORDPRESS_DB_HOST: db:3306 # wordpress连接db的3306端口
       WORDPRESS_DB_USER: wordpress # wordpress的数据库用户为wordpress
       WORDPRESS_DB_PASSWORD: wordpress # wordpress的数据库密码是wordpress
       WORDPRESS_DB_NAME: wordpress # wordpress的数据库名字是wordpress
volumes:
    db_data: {}

启动:

docker-compose up -d

查看:

docker-compose ps

停止:

docker-compose stop

注:生产环境中,多个compose文件,会进行重命名,如nginx.yaml

私有镜像仓库的Harbor搭建(未验证)

Docker容器应用的开发和运行离不开可靠的镜像管理
虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑
部署私有环境内的registry也是非常有必要的
Harbor是VMware公司开源的企业级Docker registry管理项目
包括权限管理(RBAC)、LCAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能

Harbor的官方地址:https://goharbor.io

github地址: https://github.com/goharbor/harbor

1.准备
提前准备一个ca证书
如果有自己的域名,可以到https://freessl.cn/ 申请免费的ssl证书
安装好docker-compose

2.下载Harbor离线包
https://github.com/goharbor/harbor/releases
示例版本为2.6.2

3.上传文件并解压

tar -zxvf harbor-offline-installer-v2.6.2.tgz -C /opt/

## 准备配置文件
## 将模板配置文件拷贝一份为正式的配置文件
cd /opt/harbor
cp harbor.yml.tmpl harbor.yml

4.编辑配置文件

vim harbor.yml
修改 hostname:reg.mydomain.com 为 hostname:harbor.yuankeedu.com
修改 certificate:/your/certificate/path 和 private_key:/your/private/key/path
修改为具体的证书地址
修改 harbor_password 为合适的密码

5.安装

sh install .sh

6.服务的停止和启动

cd /opt/harbor
docker-compose ps ##查看服务
docker-compose stop ##关闭
docker-compose up -d ##启动

7.访问web界面
网址:

8.拉取公共镜像

docker pull tomcat
docker tag tomcat harbor.yuankeedu.com/aminglinux/tomcat:latest

9.把拉取的Tomcat镜像推送到Harbor

# docker login https://harbor.yuankeedu.com
输入用户名和密码
# docker push harbor.yuankeedu.com/aminglinux/tomcat:latest

注:设置自己主机的host,将 harbor.yuankeedu.com 解析到自己的主机
Linux服务器和Windows服务器都要设置
问题:X509:certificate signed by unknown authority

需要在客户端机器上(也就是你执行docker login的机器上)执行

1) echo -n | openssl s_client -showcerts -connect harbor.yuankeedu.com:443

2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

>> /etc/ssl/certs/ca-bundle.trust.crt

2)systemctl restart docker
© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...