Docker 操作指南


常用命令:

     sudo docker image ls 查看镜像

     sudo docker image rm [imageName] 删除镜像

     sudo docker pull ubuntu:16.04 拉取镜像

     sudo service docker start/restart 启动

     sudo docker run hello-world 运行镜像

     sudo docker run -it hello-world 运行镜像 (-d 后台执行)

     sudo docker run -d --name=demo hello-world 制定名字

     sudo docker run -d --name demo --link test1 hello-world link到test1容器上,可直接通过test1容器名访问该容器

     sudo docker run --memory=200M hello-world 限定内存

     sudo docker run --cpu-shares=10 --name=demo hello-world 限定CPU权重

     sudo docker history image-id  查看image分层

     sudo docker image build 从Dockerfile构建镜像(better than commit)

     sudo docker container ls 查看容器

     sudo docker container ls --all 查看所以容器

     sudo docker container start/stop [containID] 启动/停止容器(containID也可以为container_name)

     sudo docker container rm [containerID] 删除容器

     sudo docker rm $(docker container ls -aq) 删除所有容器

     sudo docker rm $(docker container ls -f "status=exited" -q) 删除所有已停止的容器

     sudo docker container commit container_name dockerhub_ID/new_image_name 提交容器内的改变到新的镜像(不提倡)

     sudo docker run -it imageID /bin/bash debug使用进入镜像生成的容器

     sudo docker exec -it containerID /bin/bash 进入正在运行的容器中

     sudo docker exec -it containerID ip a 正在运行的容器的IP

     sudo docker inspect containerID 查看容器的信息

     sudo docker logs containerID 查看容器的log

     sudo docker network ls 查看docker网络

     sudo docker network inspect networkID 查看网络详情

vagrant:更方便的使用Virtual Box 创建VM学习Docker

     vagrant创建vm:

       ①新建目录

       ②vagrant init centos/7或ubuntu/xenial64(ub16.04)   初始化vagrantfile

        ③vagrant up  创建vm

     vagrant ssh 连接vm exit退出

     vagrant status 查看vm状态

     vagrant halt 停止vm

     vagrant destroy  删除vm

     vagrant plugin install vagrant-scp 安装vagrant-scp,用于将本地文件复制到vm(不要使用apt-get安装vagrant)

安装Docker:

①参考网页:

    https://blog.csdn.net/qf0129/article/details/80383098

    https://www.jianshu.com/p/1eda596d34a3

    http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html

②参考官网

③vagrantfile中配置安装Docker并启动命令(运行vagrant up即可:ub系统没运行成功还是手动安装的docker):

     在vagrantfile config.vm.provision "shell"中添加安装docker的所有命令,这样便可以vagrant up创建Docker vm。

 ④Docker machine(可参考https://www.jianshu.com/p/cc3bb8797d3b)

     不使用vagrant,使用docker-machine create demo 创建安装Docker的vm 可以在virtual box中查看

     docker-machine ls 查看vm

     docker-machine ssh demo 进入vm

     docker-machine start 运行vm

     docker-machine stop 停止vm

     docker-machine

     docker-machine 查看其他命令    

     exit 退出

     远程管理docker server:

        ①docker-machine env demo (包括阿里云的docker server)

        ②运行eval

        ③docker-machine env --unsetx取消

     docker machine 在ECS(其他云也可以)上创建Docker虚机:  

             (可参考https://www.jianshu.com/p/cc3bb8797d3b)         

         ①安装Docker Machine Driver of Aliyun ECS github上可以搜到

         ②获得阿里云账号

Image:

  ①自制镜像 利用Dockerfile文件

               FROM scratch           基础镜像

               ADD hello /

               CMD ["/hello"]

    docker build -t xxx/hello-world .               构建镜像

  ②docker hub pull/push

      docker pull image_name:version 拉取镜像

      docker push 推镜像到docker hub

         a:docker login

         b:docker image push image_name:latest

         推荐将docker hub 与 github做关联,这样只需维护github内的Dockerfile,docker hub会为我们进行build工作。

      搭建私有docker hub

         a:准备一台服务器,

            docker run -d -p 5000:5000 --restart always --name registry registry:2 起registry

            docker ps 查看是否起来

            telnet ip port 查看是否能访问服务器registry进程

            docker build -t ip:port/image_name . 创建待上传镜像

            /etc/docker下创建daemon.json 添加{ "insecure-registries":["ip:port"] }

            /lib/systemd/system/docker.service 添加 EnvironmentFile=-/etc/docker/daemon.json

            sudo service docker restart

            docker push ip:port/image_name 上传

             docker pull ip:port/image_name 拉取

Dockerfile:docker-library(github)官方提供很多Dockerfile参考

   同时Dockerfile reference官方文档也供学习

   ①FROM

      FROM scratch 制作base image

      FROM centos 使用base image

      FROM ubuntu:16.04

   ②LABEL

      LABEL maintainer="[email protected]"

      LABEL version="1.0"

      LABEL description="This is description"

   ③RUN:执行命令并创建新的Image Layer

      RUN yum update && yum install -y vim \

      python-dev    反斜线换行 &&合并命令成一行,避免无用分层

   ④WORKDIR

      WORKDIR /test   如果没有会自动创建test目录

      WORKDIR demo

      RUN pwd   输出结果为/test/demo

      用WORKDIR而不使用RUN cd 尽量使用绝对目录

   ⑤ADD and COPY

      ADD hello / 后者为image的目录

      ADD test.tar.gz / 添加到根目录并解压,不同于COPY

      --------------------------------------------------------------------

      WORKDIR /root

      ADD hello test/   结果/root/test/hello

      --------------------------------------------------------------------

      WORKDIR /root

      COPY hello test/   结果/root/test/hello

      大部分情况,COPY优于ADD ADD还具有解压功能 二者添加本地文件

      添加远程文件/目录请使用curl或者wget

   ⑥ENV

      ENV MYSQL_VERSION 5.6 设置常量

      RUN apt-get install -y mysql-server= "${MYSQL_VERSION}" \

      && rm -rf /var/lib/apt/lists/*

      使用ENV设置常量增加可维护行

   ⑦CMD:设置容器启动时默认执行的命令和参数

      如果docker run指定了其它命令,CMD命令被忽略

      docker run -it imageID /bin/bash 制定了/bin/bash命令,CMD被忽略

      如果定义了多个CMD,只有最后一个会执行

      命令分shell格式和exec格式

         ---------------------------------------------------------------

         FROM centos

         ENV name Docker

         ENTRYPOINT echo "hello $name"   #hello Docker

         ---------------------------------------------------------------

         FROM centos

         ENV name Docker

         ENTRYPOINT ["/bin/echo", "hello $name"]  #hello $name

         改成 ["/bin/bash","-c","echo hello $name"]

         --------------------------------------------------------------

         CMD接收参数的例子:

         FROM ubuntu:16.04

         RUN apt-get update && apt-get install -y stress

         ENTRYPOINT ["/usr/bin/stress"] #可执行的程序

         CMD [] #接收程序参数

         启动方式 docker run -it songof/ubuntu-stress --vm 1 --verbose(后两个是可执行程序需要的参数)

   ⑧ENTRYPOINT:设置容器启动时运行的命令

      让容器以应用程序或者服务的形式运行

      不会被忽略 一定会执行 不同于CMD

      最佳实践:写一个shell脚本作为entrypoint

         COPY docker-entrypoint.sh /usr/local/bin/

         ENTRYPOINT ["docker-entrypoint.sh"]

         EXPOSE 27017

         CMD ["mongod"]

Docker网络:

     ①linux网络命名空间

     ②Bridge

     ③容器的link

         以容器test1和容器test2为例.

             1、创建test1

                  sudo docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done"

             2、创建test2并link test1

                  sudo docker run -d --name test2 --link test1 busybox /bin/sh -c "while true; do sleep 3600; done"    

              3、容器test2内ping test1可以通,但注意反之不行。

           自创建的bridge默认将其上的容器互相link.

               1、sudo docker network create -d bridge my-bridge 创建自己的bridge

               2、sudo docker network ls查看networks

               3、brctl show 查看bridge

               4、创建新的容器并指定bridge

                    sudo docker run -d --name test3 --network my-bridge busybox /bin/sh -c  "while true; do sleep 3600; done"

                5、sudo docker network inspect networkID 查看network内的容器

                6、sudo docker network connect my-bridge test2 将已创建的test2容器接到my-bridge上    

     ④ 容器的端口映射

          以nginx容器为例:

             1、sudo docker run --name web -d -p 80:80 nginx 创建nginx容器,将容器80端口映射到本地80端口(或阿里云服务器端口)

      ⑤host和none

      ⑥单机多容器复杂应用的部署:后台代码容器+redis容器

      ⑦多机多容器复杂应用的部署(etcd+overlay网络)

Docker持久化存储和数据共享--mysql容器的数据保存解决方案


   基于本地文件系统的Volume

             ①docker run -d --name mysql1 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql

             ②docker run -d --name mysql2 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql

             mysql2容器可以使用mysql1对应的volume

             此外,bind mount可以实现本地目录和容器目录的一个映射。

   基于plugin的Volume


Docker Compose 多容器部署解决方案

          docker-compose.yml文件里配置Services(containers)、Networks、Volumes(注意使用compose file version 3)

          docker-compose常用命令:

                  docker-compose up -d 启动yml配置的多容器

                  docker-compose ps 查看运行的docker-compose容器

                  docker-compose stop 停止容器

                  docker-compose down 停止并删除容器

                  docker-compose start 运行容器

                  docker-compose images 查看docker-compose对应的images

                  docker-compose exec serviceName bash 进入服务容器

                  docker-compose build 将对应的images build,若Dockerfile需要build images                

          wordpress配置示例:

--------------------------------------------------------------------------------------------------------------------------------------------------------

version: '3'

services:

  wordpress:

    image: wordpress

    ports:

      - 8080:80

    environment:

      WORDPRESS_DB_HOST: mysql

      WORDPRESS_DB_PASSWORD: root

    networks:

      - my-bridge

  mysql:

    image: mysql

    environment:

      MYSQL_ROOT_PASSWORD: root

      MYSQL_DATABASE: wordpress

    volumes:

      - mysql-data:/var/lib/mysql

    networks:

      - my-bridge

volumes:

  mysql-data:

networks:

  my-bridge:

    driver: bridge

---------------------------------------------------------------------------------------------------------------------------------------------------------

           flask-redis配置示例:

--------------------------------------------------------------------------------------------------------------------------------------------------------

version: "3"

services:

  redis:

    image: redis

  web:

    build:

      context: .

      dockerfile: Dockerfile

    ports:

      - 8080:5000

    environment:

      REDIS_HOST: redis

------------------------------------------------------------------------------------------------------------------------------------------------------

           水平扩展和负载均衡:

                 docker-compose up --scale web=3 -d web服务起三个容器

           flask-redis配置示例:

---------------------------------------------------------------------------------------------------------------------------------------------------

FROM python:2.7

LABEL maintaner="Peng Xiao [email protected]"

COPY . /app

WORKDIR /app

RUN pip install flask redis

EXPOSE 80

CMD [ "python", "app.py" ]

----------------------------------------------------------------------------------------------------------------------------------------------------

version: "3"

services:

  redis:

    image: redis

  web:

    build:

      context: .

      dockerfile: Dockerfile

    environment:

      REDIS_HOST: redis

  lb:

    image: dockercloud/haproxy

    links:

      - web

    ports:

      - 8080:80

    volumes:

      - /var/run/docker.sock:/var/run/docker.sock

----------------------------------------------------------------------------------------------------------------------------------------------------------------

你可能感兴趣的:(Docker 操作指南)