更新时间:2022-09-23 19:44:46
jenkins-nginx
,来保存另一个Dockerfile。现在,你应该有三个目录了(如果你读过之前的文章):FROM centos:centos7 MAINTAINER yourname
RUN yum -y update; yum clean all RUN yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm; yum -y makecache RUN yum -y install nginx-1.8.0
RUN rm /etc/nginx/conf.d/default.conf RUN rm /etc/nginx/conf.d/example_ssl.conf
COPY conf/jenkins.conf /etc/nginx/conf.d/jenkins.conf COPY conf/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx"]
daemon off; user nginx; worker_processes 2; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; use epoll; accept_mutex off; } http { include /etc/nginx/mime.types; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; client_max_body_size 300m; client_body_buffer_size 128k; gzip on; gzip_http_version 1.0; gzip_comp_level 6; gzip_min_length 0; gzip_buffers 16 8k; gzip_proxied any; gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json; gzip_disable "MSIE [1-6]\."; gzip_vary on; include /etc/nginx/conf.d/*.conf; }
daemon off;
nginx
,Nginx将以daemon方式运行在后台。这会返回exit 0
,Docker会认为进程已经退出,然后停止容器。你会发现这种现象经常发生。对于Nginx来说,只要简单地修改下配置就可以解决这个问题。worker_processes 2;
use epoll; accept_mutex off;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 300m; client_body_buffer_size 128k;
gzip on; gzip_http_version 1.0; gzip_comp_level 6; gzip_min_length 0; gzip_buffers 16 8k; gzip_proxied any; gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json; gzip_disable "MSIE [1-6]\."; gzip_vary on;
conf/nginx.conf
。下一步就是为Jenkins添加特定的配置文件。server { listen 80; server_name ""; access_log off; location / { proxy_pass http://jenkins-master:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto http; proxy_max_temp_file_size 0; proxy_connect_timeout 150; proxy_send_timeout 100; proxy_read_timeout 100; proxy_buffer_size 8k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } }
proxy_pass http://jenkins-master:8080;
jenkins-master
存在,这个可以通过容器连接来保证(稍后会讲到)。如果你还没使用容器连接的话,那么需要将映射Jenkins容器的IP/hostname。localhost
。这是因为每个Docker容器都有自己的localhost
,将代理指向了Nginx容器本身,这里并没有运行在8080端口的Jenkins。为了避免使用容器连接,需要执行Docker Host(应该是你的Desktop或laptop)的IP地址。尽管你是知道这个信息的,但是请想象一下,如果你的Jenkins容器是运行在Dockerhost集群中的任意一台。你需要写一个自动脚本,来获取IP地址,然后编辑配置文件。这是可以做到的,但是非常麻烦。容器连接可以简化这一过程。docker build -t myjenkinsnginx jenkins-nginx/.
docker run --name=jenkins-data myjenkinsdata
docker stop jenkins-master docker rm jenkins-master docker run -p 8080:8080 -p 50000:50000 --name=jenkins-master --volumes-from=jenkins-data -d myjenkins
docker run -p 80:80 --name=jenkins-nginx --link jenkins-master:jenkins-master -d myjenkinsnginx
--link
参数。你可以在Docker官方网站上找到相关文档。需要确保域名"jenkins-master"在NGINX容器中存在,指向jenkins-master容器的内部Docker网络IP。-p 8000:80
参数重启它。然后,访问http://yourdockermachineip:8000,看看一切是否正常。docker stop jenkins-nginx docker stop jenkins-master docker rm jenkins-nginx docker rm jenkins-master docker run -p 50000:50000 --name=jenkins-master --volumes-from=jenkins-data -d myjenkins docker run -p 80:80 --name=jenkins-nginx --link jenkins-master:jenkins-master -d myjenkinsnginx
docker stop jenkins-nginx docker stop jenkins-master docker rm jenkins-nginx docker rm jenkins-master docker build -t myjenkins jenkins-master/. docker run --name=jenkins-master --volumes-from=jenkins-data -d myjenkins docker run -p 80:80 --name=jenkins-nginx --link jenkins-master:jenkins-master -d myjenkinsnginx
docker-compose stop docker-compose build docker-compose up -d
jenkinsdata: build: jenkins-data
docker-compose build
。docker build jenkins-data/
一样。你会注意到,镜像的名字是不同的。Compose使用的命名转换是“projectname_composecontainername”。默认情况下,项目名称是父目录的名字。-p
来制定镜像名称。你也可以使用-p
来区别产品环境和开发环境。jenkinsmaster: build: jenkins-master volumes_from: - jenkinsdata ports: - “50000:50000”
volumes_from
语句,与命令行中的--volumes-from=
的作用相同。但是,请注意Compose使用的容器名并不是真正的名字。这是Compose的一个方便的特性,可以让我们引用这些名字,提高可读性。Compose足够聪明,可以把它们组合在一起,来构建容器。ports
指令,来处理端口映射。为了JNLP从连接,我们需要确保Jenkins主容器做50000端口映射。jenkinsnginx: build: jenkins-nginx ports: - "80:80" links: - jenkinsmaster:jenkins-master
links
指令,就像命令行中的--link
。jenkinsdata: build: jenkins-data jenkinsmaster: build: jenkins-master volumes_from: - jenkinsdata ports: - "50000:50000" jenkinsnginx: build: jenkins-nginx ports: - "80:80" links: - jenkinsmaster:jenkins-master
docker stop jenkins-nginx docker rm jenkins-nginx docker stop jenkins-master docker rm jenkins-master docker rm jenkins-data
docker up
来备份数据。docker-compose build docker-compose up -d
-d
使得Docker-Compose以daemon方式运行容器,就像Docker的参数-d
一样。如果你想知道哪些容器正在运行,Docker-Compose也有相类似的特性:docker-compose ps
docker-compose stop
docker-compose build docker-compose up -d
docker-compose rm
docker-compose rm jenkinsmaster jenkinsgninx