4.Dockerfile创建镜像 – Dockerfile格式
5.Dockerfile创建镜像 – Dockerfile示例
1. Docker网络模式
- host模式,使用docker run时使用--net=host指定
- docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机ip
- container模式,使用--net=container:container_id/container_name
- 多个容器使用共同的网络,看到的ip是一样的
- none模式,使用--net=none指定
- 这种模式下,不会配置任何网络
- bridge模式,使用--net=bridge指定默认模式,不用指定默认就是这种网络模式。这种模式会为每个容器分配一个独立的Network Namespace。类似于vmware的nat网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。
2. Docker网络管理-外部访问容器
- 首先使用centos镜像新建一个容器,然后在该容器中安装httpd服务,并启动
- 再把该容器导成一个新的镜像(centos-httpd),然后再使用新镜像创建容器,并指定端口映射
- docker run -itd -p 5123:80 centos-httpd bash //-p 可以指定端口映射,本例中将容器的80端口映射为本地的5123端口
- docker exec -it container_id bash
- 启动httpd: httpd -k start
- 编辑1.html: vi /var/www/html/1.html 随便写点东西
- 退出该容器:exit
- 测试: curl 127.0.0.1:5123/1.html
- -p后面也支持IP:port:ip:port 的格式,比如
- -p 127.0.0.1:8080:80
- 也可以不写本地的端口,只写ip,这样会随意分配一个端口
- -p 127.0.0.1::80 //注意这里是两个冒号
2.1 Operation not permitted
- 新建的容器,启动nginx或者httpd服务的时候会报错
- Failed to get D-Bus connection: Operation not permitted
- 这是因为dbus-daemon没有启动,解决该问题可以这样做
- 启动容器时,要加上--privileged -e "container=docker" ,并且最后面的命令改为/usr/sbin/init
- docker run -itd --privileged -e "container=docker" centos_with_nginx /usr/sbin/init
3.Docker网络管理-配置桥接网络
- 为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求。这个需求其实很容易实现,我们只要将Docker容器和宿主机的网卡桥接起来,再给Docker容器配上IP就可以了。
- cd /etc/sysconfig/network-scripts/; cp ifcfg-eth0 ifcfg-br0
- vi ifcfg-eth0 //增加BRIDGE=br0,删除IPADDR,NETMASK,GATEWAY,DNS1
- vi ifcfg-br0//修改DEVICE为br0,Type为Bridge,把eth0的网络设置设置到这里来
- systemctl restart network
- 安装pipwork
- git clone https://github.com/jpetazzo/pipework
- cp pipework/pipework /usr/local/bin/
- 开启一个容器
- docker run -itd --net=none --name aming123 centos_with_nettool bash
- pipework br0 aming123 172.7.15.201/24@172.7.15.3 #201为容器的ip,@后面的ip为网关ip
- docker exec -it aming123 bash #进去后ifconfig查看就可以看到新添加的ip
4.Dockerfile创建镜像 – Dockerfile格式
- 1. FROM //指定基于哪个基础镜像
- 格式 FROM <image> 或者 FROM <image>:<tag>, 比如
- FROM centos
- FROM centos:latest
- 2. MAINTAINER //指定作者信息
- 格式 MAINTAIN <name> ,比如
- MAINTAINER aming aming@aminglinux.com
- 3. RUN //镜像操作指令
- 格式为 RUN <command> 或者 RUN [“executable”, “param1”, “param2”],比如
- RUN yum install httpd
- RUN ["/bin/bash", "-c", "echo hello"]
- 4. CMD // 三种格式:
- CMD ["executable", "param1", "param2"]
- CMD command param1 param2
- CMD ["param1", "param2"]
- RUN和CMD看起来挺像,但是CMD用来指定容器启动时用到的命令,只能有一条。比如
- CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]
- 5. EXPOSE
- 格式为 EXPOSE <port> [<port>...] , 比如
- EXPOSE 22 80 8443 这个用来指定要映射出去的端口,比如容器内部我们启动了sshd和nginx,所以我们需要把22和80端口暴漏出去。这个需要配合-P(大写)来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写)来指定。
- 6. ENV
- 格式 ENV <key> <value>, 比如
- ENV PATH /usr/local/mysql/bin:$PATH
- 它主要是为后续的RUN指令提供一个环境变量,我们也可以定义一些自定义的变量
- ENV MYSQL_version 5.6
- 7. ADD 格式 add <src> <dest>
- 将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url。比如
- ADD <conf/vhosts> </usr/local/nginx/conf>
- 8. COPY
- 格式同add
- 使用方法和add一样,不同的是,它不支持url
- 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
- 格式 USER daemon
- 指定运行容器的用户
- 12. WORKDIR
- 格式 WORKDIR /path/to/workdir
- 为后续的RUN、CMD或者ENTRYPOINT指定工作目录
5.Dockerfile创建镜像 – Dockerfile示例
- 先下载nginx的配置文件
- wget http://www.apelearn.com/study_v2/.nginx_conf
- vim Dockerfile //内容如下
- ## Set the base image to CentOS
- FROM centos
- # File Author / Maintainer
- MAINTAINER aming aming@aminglinux.com
- # Install necessary tools
- RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel
- # Install Nginx
- ADD http://nginx.org/download/nginx-1.8.0.tar.gz .
- RUN tar zxvf nginx-1.8.0.tar.gz
- RUN mkdir -p /usr/local/nginx
- RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install
- RUN rm -fv /usr/local/nginx/conf/nginx.conf
- COPY .nginx_conf /usr/local/nginx/conf/nginx.conf
- # Expose ports
- EXPOSE 80
- # Set the default command to execute when creating a new container
- ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd
- 创建镜像:
- docker build -t centos_nginx .
- docker images //可以看到我们新建的镜像
- docker run -itd -p 8088:80 centos_nginx bash
6.用Docker compose部署服务
- docker compose可以方便我们快捷高效地管理容器的启动、停止、重启等操作,它类似于linux下的shell脚本,基于yaml语法,在该文件里我们可以描述应用的架构,比如用什么镜像、数据卷、网络模式、监听端口等信息。我们可以在一个compose文件中定义一个多容器的应用(比如jumpserver),然后通过该compose来启动这个应用。
- 安装compose方法如下
- curl -L https://github.com/docker/compose/releases/download/1.17.0-rc1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- chmod 755 !$
- docker-compose version 查看版本信息
- Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1没有声明版本默认是"version 1"。Version 1将来会被弃用。
- vim docker-compose.yml //内容到https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/25docker/docker-compose.yml 查看
- docker-compose up -d 可以启动两个容器
- docker-compose --help
- docker-compose ps/down/stop/start/rm
- 关于docker-compose语法的参考文档 http://www.web3.xin/index/article/182.html