美文网首页
Docker入门

Docker入门

作者: Hey_Shaw | 来源:发表于2018-10-17 09:57 被阅读24次

    Linux安装Docker

    安装docker本身

    $ sudo wget -qO- https://get.docker.com/ | sh
    -q:让wget输出不要过多
    -O-:把wget的输出直接输出到标准输出,而不是输出到文件,管道技术交给sh执行
    

    运行非root用户运行docker

    $ sudo usermod -aG docker imooc
    把用户加到docker用户组中,使指定用户获取执行docker权限
    

    启动docker服务

    $ systemctl start docker.service
    

    设置开机启动

    $ sudo systemctl enable docker
    

    docker架构介绍

    实战

    $ docker run ubuntu echo hello docker
    

    运行nginx

    $ docker run -p 8080:80 -d nginx        #将docker容器的80端口映射到宿主机8080端口
    

    访问:宿主机ip:8080

    定制化自己的nginx页面

    $ cat index.html
    <html>
      <h1>Docker is fun!</h1>
    </html>
    
    $ docker ps  # 查看运行镜像,获取镜像ID
    
    $ docker cp index.html 653c6d248e5a://usr/share/nginx/html
    
    $ docker stop 653c6d248e5a  # 停止运行的镜像
    
    $ docker run -p 8080:80 -d nginx  # 原来设定的网页被还原
    
    $ docker cp index.html 58cf1b4ef86b://usr/share/nginx/html
    
    $ docker commit -m 'fun' 58cf1b4ef86b nginx-fun   # 保存自定义,生成新的镜像nginx-fun
    
    $ docker rmi 1696742493b7  # 删除镜像
    
    $ docker ps -a # 显示所有运行过的镜像
    
    $ docker rm 5e23511ac629 653c6d248e5a   # 删除运行过的镜像历史
    

    命令小结

    命令 用途
    docker pull 获取image
    docker build 创建image
    docker images 列出image
    docker run 运行container
    docker ps 列出container
    docker rm 删除container
    docker rmi 删除image
    docker cp 在host和container之间拷贝文件
    docker commit 保存改动为新的image

    Dockerfile

    touch Dockerfile # 新建Dockerfile

    FROM alpine:latest
    MAINTAINER jack
    CMD echo "Hello Docker!"
    

    构建新的image

    $ docker build -t hello_docker .
    
    Sending build context to Docker daemon  2.048kB
    Step 1/3 : FROM alpine:latest
    latest: Pulling from library/alpine
    4fe2ade4980c: Pull complete 
    Digest: sha256:621c2f39f8133acb8e64023a94dbdf0d5ca81896102b9e57c0dc184cadaf5528
    Status: Downloaded newer image for alpine:latest
     ---> 196d12cf6ab1
    Step 2/3 : MAINTAINER jack
     ---> Running in 0bf9be49775b
    Removing intermediate container 0bf9be49775b
     ---> 2752ef8ca6a2
    Step 3/3 : CMD echo "Hello Docker!"
     ---> Running in 5aa61e2dcc24
    Removing intermediate container 5aa61e2dcc24
     ---> 9feb05314694
    Successfully built 9feb05314694
    Successfully tagged hello_docker:latest
    

    运行镜像

    $ docker run hello_docker
    Hello Docker!
    

    Dockerfile实战

    FROM ubuntu
    MAINTAINER jack
    RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list  # 替换archive.ubuntu.com为mirrors.ustc.edu.cn,加速
    RUN apt-get update
    RUN apt-get install -y nginx
    COPY index.html /var/www/html
    ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
    EXPOSE 80
    

    自定义新建index.html
    执行下列命令

    docker build -t jack/hello_nginx .     # 构建镜像
    docker run -d -p 80:80 jack/hello_nginx   # 启动镜像
    docker stop jack/hello_nginx  # 停止镜像
    

    Dockerfile语法

    命令 用途
    FROM base image
    RUN 执行命令
    ADD 添加文件
    COPY 拷贝文件
    CMD 执行命令
    EXPOSE 暴露端口
    WORKDIR 指定路径
    MAINTAINER 维护者
    ENV 设定环境变量
    ENTRYPOINT 容器入口
    USER 指定用户
    VOLUME mount point

    注:Dockerfile中的每一行都产生一个新层

    Volume:提供独立于容器之外的持久化存储

    $ docker run -d --name nginx -v /usr/share/nginx/html nginx
    $ docker inspect nginx   # 容器所有信息
    
    ...
    "Mounts": [   # 数据卷
                {
                    "Type": "volume",
                    "Name": "c6670ae27f24945d3f19267db45e730def339ba36eae1028fa3a94e116eab20e",
                    "Source": "/var/lib/docker/volumes/c6670ae27f24945d3f19267db45e730def339ba36eae1028fa3a94e116eab20e/_data",
                    "Destination": "/usr/share/nginx/html",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],
    ...
    
    $ docker exec -it nginx /bin/bash   # 进入容器内部
    $ cd /usr/share/nginx/html/
    

    第二种数据卷:docker run -v $PWD/code:/var/www/html nginx

    $ docker run -p 80:80 -d -v $PWD/html:/usr/share/nginx/html nginx
    $ vim index.html   # 修改即可生效
    

    第三种Volume:docker run --volumes-from ...

    $ docker create -v $PWD/data:/var/mydata --name data_container ubuntu
    $ docker run -it --volumes-from data_container ubuntu /bin/bash
    

    Registry(镜像仓库)

    术语

    English 中文
    host 宿主机
    image 镜像
    container 容器
    registry 仓库
    daemon 守护程序
    client 客户端
    $ docker search whalesay
    $ docker pull whalesay
    $ docker push myname/whalesay
    

    compose介绍(多容器app)

    Linux下安装docker-compose

    $ curl -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose
    $ chmod a+x /usr/local/bin/docker-compose
    $ docker-compose --version
    

    github中提示安装方式的写法为:

    $ curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    $ chmod +x /usr/local/bin/docker-compose
    

    docker-compose实战

    docker-compose.yaml

    ghost-app:
      build: ghost
      depends_on:
        - db
      ports:
        - "2368:2368"
    nginx:
      build: nginx
      ports:
        - "80:80"
      depends_on:
        - ghost-app
    db:
      image: "mysql:5.7.15"
    
    实战部分

    目录:$PWD/ghost/下:

    $ mkdir ghost
    $ mkdir data
    $ mkdir nginx
    
    $ cd ghost
    $ vim Dockerfile
    
    FROM ghost
    COPY ./config.js /var/lib/ghost/config.js
    EXPOSE 2368
    CMD ["npm","start","--production"]
    
    $ vim config.js
    
    var path = require('path'),
    config;
    
    config = {
        production: {
            url: 'http://mytestblog.com',
            mail: {},   
            database: {
                client: 'mysql',
                connection: {
                    host     : 'db',
                    user     : 'ghost',
                    password : 'ghost',
                    database : 'ghost',
            port: '3306',
                    charset  : 'utf8'
    
                },
                debug: false
            },
        paths: {
            contentPath: path.join(process.env.GHOST_CONTENT,'/')
        },
            server: {
                host: '0.0.0.0',
                port: '2368'
            }
        }
    
    };
    
    module.exports = config;
    

    cd ./nginx

    $ vim Dockerfile
    FROM nginx
    COPY nginx.conf /etc/nginx/nginx.conf
    EXPOSE 80
    
    $ vim nginx.conf
    
    worker processes 4;
    events {worker connections 1024;}
    http {
        server {
            listen 80;
        location / {
            proxy pass http://ghost-app:2368;
        }
        }
    }
    

    cd ./ghost

    $ vim docker-compose.yml
    
    version: '2'
    
    networks: 
      ghost:
    
    services:
      ghost-app:
        build: ghost
        networks: 
          - ghost
        depends_on: 
          - db
        ports: 
          - "2368:2368"
                
      nginx: 
        build: nginx
        networks: 
          - ghost
        depends_on: 
          - ghost-app
        ports: 
          - "80:80"
      
      db: 
        image: "mysql:5.7.15"
        networks:
          - ghost
        environment:
          MYSQL_ROOT_PASSWORD: mysqlroot
          MYSQL_USER: ghost
          MYSQL_PASSWORD: ghost
        volumes: 
          - $PWD/data:/var/libmysql
        ports: 
          - "3306:3306"
    

    进入 $PWD/ghost/ 执行

    $ docker-compose up -d        # 构建服务
    $ docker-compose stop          # 停止服务
    

    相关文章

      网友评论

          本文标题:Docker入门

          本文链接:https://www.haomeiwen.com/subject/xyiywftx.html