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 rmi image
存出镜像 docker save [image ID]
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 复制指定的<src>路径下的内容到容器中的<dest>路径下,<src>可以为URL;如果为tar文件会自动解压到<dest>路径下
COPY 复制本地方机的<src>路径下的内容到镜像中的<dcst>路径下,一般情况下推荐使用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 <741047261@qq.com>
# 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
sudo docker-compose up -d