Docker学习笔记(精华版)

Docker三剑客(Machine Compose Swarm)

容器技术充分利用操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化。

容器有效地将由单个操作系统管理的资 源划分到孤立的组中,以更好地孤立的组之间平衡有冲突的资 源使用需求。

优势:

1、快速分发和部署

2、一次创建或配置任意地方使用

3、更简单的更新管理

1、docker安装

yum install docker

2、docker常用命令

获取镜像 docker pull image

搜索镜像 docker search image

运行镜像 docker run image

添加标签 docker tag image:tag myimage:tag

查看详情 docker inspect image

查看历史 docker history image

排除以某一类容器
docker ps |grep -v cname

删除镜像 docker rmi image

存出镜像 docker save [image ID]

杀死所有正在运行的容器
docker kill $(docker ps -a -q)

删除所有已经停止的容器
docker rm $(docker ps -a -q)

删除所有以dev-开头的容器
docker rm docker ps --filter "name=dev-*" -a -q

强制删除所有镜像
docker rmi -f $(docker images -q)

强制删除所有以dev开头的镜像
docker rmi -f $(docker images dev-* -q)

docker清除所有容器:
docker rm -f (sudo docker ps -qa)

docker save -o ubuntu_14.04.tar ubuntu:14.04

载入镜像 docker load [image.tar]

docker load --input ubuntu_14.04.tar

进行容器

sudo docker exec -it 容器id /bin/bash

3、docker镜像

创建镜像有三种方式:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建

1、基于已有镜像的容器创建 docker commit

docker commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0 test:0.1

2、基于本地模板导入 使用命令docker import,要直接导入一个镜像可以使有和OpenVZ提供的模板来创建。

 cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04

镜像自身是只读的。容器从镜像启动的时候会在镜像的最上层创建一个可写层

使用公有镜像

docker pull 镜像名字

构建自用镜像

docker commit 容器id

4、docker容器

容器是镜像的一个运行实例

创建容器 docker create [image ID] -it可交互式容器,使用docker create命令新建的容器处理停止状态,可以使用docker start命令启动

-d, --detach=false, 指定容器运行于前台还是后台,默认为false
-i, --interactive=false, 打开STDIN,用于控制台交互
-t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false
-u, --user="", 指定容器的用户
-a, --attach=[], 登录容器(必须是以docker run -d启动的容器)
-w, --workdir="", 指定容器的工作目录
-c, --cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用
-e, --env=[], 指定环境变量,容器中可以使用该环境变量
-m, --memory="", 指定容器的内存上限
-P, --publish-all=false, 指定容器暴露的端口
-p, --publish=[], 指定容器暴露的端口
-h, --hostname="", 指定容器的主机名
-v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录
--cap-add=[], 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[], 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="", 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="", 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
--device=[], 添加主机设备给容器,相当于设备直通
--dns=[], 指定容器的dns服务器
--dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
--entrypoint="", 覆盖image的入口点
--env-file=[], 指定环境变量文件,文件格式为每行一个环境变量
--expose=[], 指定容器暴露的端口,即修改镜像的暴露端口
--link=[], 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[], 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
--name="", 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge", 容器网络设置:
bridge 使用docker daemon指定的网桥
host //容器使用主机的网络
container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
none 容器使用自己的网络(类似--net=bridge),但是不进行配置
--privileged=false, 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="no", 指定容器停止后的重启策略:
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
--rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

启动容器 docker start

创建并启动容器 docker run

查看日志 docker logs

停止容器 docker stop

进入容器:1、docker attach 容器id,2、docker exec -it 容器id /bin/bash,3、nsenter工具

删除容器 docker rm 容器id

导出容器 docker export

docker export -o test_for_run.tar ce554267d7a4

导入容器 docker import

 docker import test_for_run.tar - test/ubuntu:v1.0

既可以使用docker load命令来导入镜像存储文件到本地镜像库,也可以使用docker import命令来导入一个容器快照到本地镜像库,区别在于容器快照文件将丢弃所有的历史记录和元数据信息,而镜像存储文件将保存完整记录,体积也更大。从容器快照文件导入时可以重新指定标签等元数据信息。

5、docker仓库

Docker仓库分为公开仓库和私有仓库,私有仓库镜像可通过push命令上传到公有仓库

创建私有仓库,安装docker后,可以通地管方提供的registry像像来简单搭建一套本地私有仓库环境

docker run -d -p 5000:5000 registry
docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
#上传镜像到私有仓库
docker push ip:5000/test

6、docker数据管理

1、数据卷(Data Volumes):容器内数据直接映射到本地主机环境;

2、数据卷容器(Data Volume Containers):使用特定容器维护数据卷。

在用docker run 命令的时候,使用- v 标记可以在容器内创建一个数据卷。多次重复使用-v 标记可以创建多个数据卷。

如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。

docker run -it --volumes-from dbdata --name db1 ubuntu

如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用 docker rm-v 命令来指定同时删除关联的容器。

可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。

1、备份

docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata

解释:worker 容器启动后,使用了 tar cvf/backup/backup.tar/dbdata命令来将/dbdata 下内容备份为容器内的/ backup/ backup.tar,即宿主主机当前目录下的backup.tar。

2、恢复

docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

解释:创建另一个新的容器,挂载 dbdata2的容器,并使用untar 解压备份文件到所挂载的容器卷中

7、端口映射容器互联

当容器中运行一些网络应用,要让外部访问这些应用时,可以通过- P或-p 参数来指定端口映射。当使用-P(大写的)标记时,Docker会随机映射一个49000~49900 的端口到内部容器开放的网络端口。

#随机映射
docker run -d -P training/webapp python app.py
#映射所有接口地址
docker run -d -p 5000:5000 training/webapp python app.py
#映射到指定地址的指定端口
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
#映射到指定地址的任意端口
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
#使用 udp 标记来指定 udp端口
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
#查看映射端口配置
docker port nostalgic_morse 5000
#容器有自己的内部网络和 IP地址,使用docker inspect+容器ID 可以获取容器的具体信息

容器的互联(linking)是一种让多个容器中应用进行快速交互的方式。连接系统依据容器的名称来执行。因此,首先需要定义一个好记的容器名字。

使用--link 参数可以让容器之间安全地进行交互。

docker run -d -P --name web --link db:db training/webapp python app.py

Docker 相当于在两个互联的容器之间创建了一个虚机通道,而且不用映射它们的端口到宿主主机上。

使用env 命令来查看 web 容器的环境变量

 docker run --rm --name web2 --link db:db training/webapp env

8、dockerfile

一开始必须指明所基于的镜像名称,接下来一般是说明维护者信息。后面则是镜像操作指令,例如 RUN 指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN 指令,镜像就添加新的一层,并提交。最后是 CMD指令,用来指定运行容器时的操作命令。

FROM 指定所创建镜像的基础镜像
NAUBTAUBER 指定维护者信息
RUN 运行命令
CMD 指定启动容器时默认执行的命令
LABEI 指定生成镜像的元数据标签信息
EXPOSE 声明镜像内服务所监听的端口
ENV 指定环境变量
ADD 复制指定的路径下的内容到容器中的路径下,可以为URL;如果为tar文件会自动解压到路径下
COPY 复制本地方机的路径下的内容到镜像中的路径下,一般情况下推荐使用COPY,而不是ADD
ENTRYPOINT 指定镜像的默认入口
VOLUME 创建数据卷挂载点
USER 指定运行容器时的用户名或UID
WORKDIR 配置工作目录
ARG 指定镜像内使用的参数(例如版本号信息等)
ONGUILD 配置当前创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令
STOPSIGNAL 容器退出时的信号值
HEALTHCHECK 如何进行健康检查
SHELL 指定使用shell时的默认shell类型

任何Dockerfile 中的第一条指令必须为 FROM指令。并且,如果在同一个Dockerfile 中创建多个镜像,可以使用多个 FROM 指令(每个镜像一次)。

#nginx Dockerfile编写

# base image
FROM centos
# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.15.8.tar.gz /usr/local/src
# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel 
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx
# change dir to /usr/local/src/nginx-1.15.8
WORKDIR /usr/local/src/nginx-1.15.8
# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio  --with-http_ssl_module  --with-http_realip_module    --with-http_addition_module    --with-http_xslt_module   --with-http_image_filter_module    --with-http_geoip_module  --with-http_sub_module  --with-http_dav_module --with-http_flv_module    --with-http_mp4_module --with-http_gunzip_module  --with-http_gzip_static_module  --with-http_auth_request_module  --with-http_random_index_module   --with-http_secure_link_module   --with-http_degradation_module   --with-http_stub_status_module && make && make install
EXPOSE 80
#构建镜像
sudo docker build -t nginx:v1 .

创建springboot 应用镜像

# Docker image for springboot file run
# VERSION 0.0.1
# Author: pibigstar
# 基础镜像使用java
FROM primetoninc/jdk:1.8
# 作者
MAINTAINER pibigstar <[email protected]>
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar
ADD docker-test.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

构建镜像

sudo docker build -t springboot-demo .

运行指定镜像

sudo docker run -d -p 8081:8080 springboot-demo

9、docker-compose

1、linux安装

> sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

> sudo chmod +x /usr/local/bin/docker-compose
> sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

2、docker-compose.yml

version: '3'
services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: your-mysql-root-password
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     volumes:
        - wp_site:/var/www/html
     ports:
       - "80:80"
       - "443:443"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:
    wp_site:

spark:docker-compose.yml

version: '3'
services: 
   master: 
     image: sequenceiq/spark:1.4.0
     hostname: master
     ports:
       - "4040:4040"
       - "8042:8042"
       - "7077:7077"
       - "8088:8088"
       - "8080:8080"
     restart: always
     deploy: 
          resources: 
            limits: 
                cpus: '0.50'
                memory: '1024M'
            reservations :
               cpus: '0.25'
               memory: '256M'
     command: bash /usr/local/spark/sbin/start-master.sh && ping localhost > /dev/null
   worker:
     image: sequenceiq/spark:1.4.0
     links: 
          - master:master
     expose: 
          - "8081"
     restart: always
     command: bash /usr/local/spark/sbin/start-slave.sh spark://master:7077 && ping localhost > /dev/null

SpringBoot+mysql:docker-compose.yml

version: '2'
services:
  #tomcat容器
  app1:
    #定义主机名
    hostname: my_app
    #使用的镜像
    image: webapp:latest
    #容器的映射端口
    ports:
      - 8080:10010
    #定义IP网络
    links: 
      - "pd:pg_server" 
      - "mysql:mysql_server"

  #mysql容器
  mysql:
    #定义主机名
    hostname: my_mysql
    #使用的镜像
    image: my_mysql:latest
    #定义挂载点
    volumes:
      - ./mysql/data:/var/lib/mysql
    #定义mysql字符utf8
    command: --character-set-server=utf8
    #定义环境变量,mysql里密码,用户,数据库
    environment: 
      MYSQL_ROOT_PASSWORD: bysjhhrl2019

sudo docker-compose up -d

你可能感兴趣的:(Docker学习笔记(精华版))