docker 第三天


docker 第三天
    • 昨日复习
    • 今日内容
      • 1.Dockerfile
      • 2.利用Dockerfile构建nginx+Django
  • 昨日复习

    1、linux网络
    
    	为了网络协议栈的多实例,linux提供了一个名称空间(包含网络名称空间),每一个名称空间相互隔离,彼此之间网络不互通。
    
    2、docker网络
    
    	docker网络依赖于linux网络。
    
    	1、veth设备对
    	2、iptables 
    	3、ipvs
    	4、网桥
    	
    	-p
    	-P
    
    3、docker network
    	
    	1、host模式
    	2、container模式
    		2.1、--link
    	3、none模式
    	4、网桥
    	
    	--network
    	
    	docker network create
    	docker network ls
    	docker network inspect 
    	docker network connect
    	docker network disconnect
    	docker network rm 
    	docker network prune 
    

    今日内容

    1.Dockerfile

    Dockerfile可以构建容器。
    #必须创建一个Dockfile的文件 文件放在轻量级 或者值包含他需要的文件夹里  不然吃内存
    通过指令
    
    1、指令
        1.1、依赖基础镜像的指令,必须在Dockerfile的顶端 #指令必须大写
        FROM	
    	FORM python:3.6 
        
        1.2、执行命令的指令(RUN指令执行的命令,必须是基础容器中支持的命令),将执行的结果保存到镜像中
        RUN 
        
        1.3、添加文件到镜像
        ADD
    	
    	注:
    		1.3.1、ADD支持解压功能(仅支持tar解压) 自动解压
    		1.2.2、支持远程下载功能,但是如果是远程下载的文件,则不解压
    		
       	1. 4、复制文件到镜像
    	COPY
    	
    	1.5、暴露端口
    	EXPOSE
    	
    		80 443
    		80/tcp 443/udp
    	1.6、工作目录
    	WORKDIR
    	WORKDIR /opt/linux
    	1.7、设置容器启动时执行的命令
    	CMD 
    
            FROM python:3.6
            RUN pip install django
            ADD linux.tar.gz /opt
            EXPOSE 80
            WORKDIR /opt/linux
            CMD python manage.py runserver 0.0.0.0:80
    
    	1.8、定义Dockerfile变量的指令
    	ARG #可以构建多个镜像
    	#第一种用法
            ARG packages=pymysql
            RUN pip install $packages
        #第二种用法 (直接在构造镜像时加上)
        	docker build --build-arg=packages=redis -t test:v7 .
    	1.9、触发器指令(构建时不作任何操作,但是在作为基础镜像时触发)Dockerfile的FROM指定这个镜像时候 会触发
    	ONBUILD #他后面跟的是指令 不是命令
    		ONBUILD RUN touch /opt/1.txt
    		#不知道执行了一条什么命令
    		Step 1/9 : FROM test:v7
            # Executing 1 build trigger
             ---> Running in 69ea9b5f1003
    		
    2、构建镜像的命令
    	docker build -t [镜像名称] [Dockerfile的路径]
    	docker build -t test:v1 .
    
    注:
    	2.1、Dockerfile的文件名
    	2.2、一旦开始构建容器,当前目录会被虚拟到Docker容器中
    

    2.利用Dockerfile构建nginx+Django

    #1.先创建一个文件夹 work 里面分别创建django 和nginx
    #2.django里面创建Dockerfile
    vim Dockerfile 
        FROM python:3.6  #用哪个镜像
    
        ADD linux.tar.gz /opt #把django压缩包复制过去 自动解压
    
        EXPOSE 80    #开放端口 80
    
        WORKDIR /opt/linux #工作目录 启动这个镜像的容器初始目录
    
        RUN pip install django  #执行下载django命令
    
        CMD python manage.py runserver 0.0.0.0:80  #容器启动运行django
    #3.nginx里面的default
    vim default.conf 
    
        server{
                server_name =;
                listen 80;
                location /{
                        proxy_pass http://django;
                }
        }	
    #4.nginx 里面创建Dockerfile
    vim Dockerfile 
        FROM nginx  #用哪个镜像
    
        ADD default.conf /etc/nginx/conf.d/  #把这个default.conf 复制过去 
    
        EXPOSE 80 #开放端口
    
        CMD nginx -g 'daemon off;'  #容器启动时 前台启动nginx
    #5.构建镜像
    	docker build -t nginx:v1 .
        docker build -t django:v1 .
    #6.刚创建的镜像
    docker images
    REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
    nginx        v1        91d7bb067626   13 minutes ago      141MB
    django       v1        848f9f3c8732   19 minutes ago      943MB
    #创建django容器
    docker run -d --name django -P --network zhang django:v1
    
    #创建nginx容器
    docker run -d --name nginx -P --network zhang nginx:v1
    

    3.容器化BBS

    #1.代码拖进来
    #2.创建requirements.txt文件
        django ==1.11.11
        pymysql
        并执行pip3 install -Ur requirements.txt 
    #3.创建一个容器
    	docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
         #并且在容器创建一个数据库 
    #4.数据迁移
    	把app01里面的migrations文件夹内容清空,并且创建一个__init__
        然后迁移
        python3 manage.py makemigrations
        python3 manage.py migrate
    #5.创建Dockerfile
    	FROM python:3.6
    
        ADD ./ /opt
    
        WORKDIR /opt
    
        RUN pip install -Ur requirements.txt
    
        EXPOSE 80
    
        CMD python manage.py runserver 0.0.0.0:80
            
         #注意settings 里面 database的host 不能是127.0.0.1了 要写成mysql
    #6.构建镜像
    	docker build -t bbs:v1 .
    
    #7.加入网桥
    						网桥名  容器名
    	docker network connect zhang mysql
        
    #8.容器使用网桥
    	docker run -d --name bbs  --network zhang bbs:v1
            
    #9.使用nginx 代理
    	#建文件夹nginx 里面的default.conf
            server {
            server_name _;
            listen 80;
            location / {
                proxy_pass http://bbs;
            }
        }
        #建Dockerfile
        FROM nginx
        ADD default.conf /etc/nginx/conf.d/
        EXPOSE 80
        CMD nginx -g 'daemon off;'
    #启动
    	docker run -d --name nginxv2 -p 8091:80 --network zhang nginx:v2