摘要
本文部分内容来源于网络,个人收集整理,请勿传播
这篇文章的内容是我在学习docker的过程中记录的,仅供参考
本文后面大部分实例都是取自《第一本docker书》,内容已经很老了,比较陈旧,参考一下就行了,不需要去自己试验了,后面会有一篇文章记录日常试验的过程。
本文主要docker环境为 ubuntu 16.04.1。
docker 安装
1 |
|
ubuntu 安装
安装启动项管理工具
1 | apt-get install sysv-rc-conf |
1 | apt update && apt upgrade -y |
手动安装
1 | # step 1: 安装必要的一些系统工具 |
centos7 安装
干净的 CentOS 7(Kernel > 3.10)环境
1 | yum -y update |
Kernel 需要使用 3.10.0-514.6.1.el7.x86_64 以上 当前稳定版本 1.13.0
1 | export YUM_URL="http://mirrors.aliyun.com/docker-engine/yum" |
手动安装(old)
1 | # step 1: 安装必要的一些系统工具 |
二进制安装
1 |
|
Docker 配置
配置 firewalld4
1 | # 关闭 Docker |
配置 LVM
1 | Docker Storage Driver 23 |
国内镜像仓库
配置 Docker
1 | 创建 /etc/docker/daemon.json |
完整配置
1 | { |
Docker 管理
1 | systemctl enable docker |
配置(old)
修改ufw
1 | vim /etc/default/ufw |
修改启动参数(old)
1 | vim /etc/default/docker |
systemd配置
如果是init管理进程则不用执行以下步骤
如果是systemd管理进程要做以下修改
1 | vim /lib/systemd/system/docker.service |
docker 守护进程
docker的守护进程会监听/var/run/docker.sock
运行docker守护进程的时候可以用-H指定绑定的端口信息
1 | docker -d -H tcp://0.0.0.0:2375 |
如果修改了服务端的监听端口,客户端不会自行变更,需要
1 | docker -H :2375 |
或者可以修改DOCKER_HOST参数
1 | export DOCKER_HOST="tcp://0.0.0.0:2375" |
也可以绑定多个监听地址
1 | docker -d -H tcp://0.0.0.0:2375 -H unix://home/docker/docker.sock |
也可以修改/etc/default/docker的配置文件来配置
docker的基本操作
查看基本信息
1 | docker info |
出现这个 WARNING: No swap limit support
解决办法
1 | vim /etc/default/grub |
1 | Containers: 0 |
运行第一个容器
1 | docker run -it ubuntu /bin/bash |
ubuntu是镜像,如果本地没有会自行下载
1 | docker ps 可以看到正在运行的容器 |
给启动的容器命名
1 | docker run --name my -it ubuntu /bin/bash |
临时启动的容器退出会自动关闭
1 | docker start my |
创建守护容器
1 | docker run --name daemon_my -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done" |
一些查看容器信息的命令
查看容器日志
1 | docker logs -ft daemon_my |
实时查看容器资源使用情况
1 | docker stats daemon_my |
查看容器内的进程
1 | docker top daemon_my |
查看镜像构建历史
1 | docker history imageid |
查看镜像开放的端口
1 | docker port sinaapp |
启动时设定主机名
1 | docker run -h|--hostname xxx |
docker镜像迁移
1 | docker save -o ooppwwqq0.sinatra.tar ooppwwqq0/sinatra |
在容器内运行进程
exec命令可以在运行的容器内运行新进程
运行的进程分为两种:后台任务和交互任务
1 | 后台任务 |
1 | 交互任务 |
停止守护式容器
1 | docker stop daemon_my |
可以用stop向容器发出SIGTERM信号
也可以用kill向容器发出SIGKILL信号
自动重启容器
1 | docker run --restart=always --name daemon_my -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done" |
深入容器
docker ps只能获取容器的基础信息,还可以用inspect来获取容器的 更多信息。
1 | docker inspect daemon_my |
也可以使用-f或者–format 来获取指定结果,这个参数支持Go语言的模板
1 | docker inspect --format='{{ .State.Running }}' daemon_my |
还可以去/var/lib/docker查看docker的文件,镜像,容器都保存在这里目录下
删除容器
1 | docker rm `docker ps -aq` |
docker镜像和仓库
docker镜像简介
docker镜像是由文件系统叠加而成的。最底端的是一个引导文件系统bootfs。
一个容器启动时,它会移动到内存中,而引导文件系统就会被卸载,留出更多的内存给initrd磁盘镜像使用。
实际上,docker镜像的第二层是root文件系统rootfs,它可以是一种或者多种操作系统。
传统的linux系统:引导启动时,rootfs先以只读的方式加载,引导结束并且完成完整性检查后才会切换成读写模式。
而docker的rootfs一直是只读的,并且docker利用联合加载技术在rootfs上加载更多只读文件系统。联合加载指的是一次同时加载多个文件系统,但是在外面看只有一个,它会把各层文件系统叠加在一起,这样最终的文件系统会包含所有底层的文件和目录。这就是docker的镜像。
docker的镜像可以放在另一个镜像的顶部,下面的叫父镜像,最底部的称为基础镜像,从一个镜像启动的时候,docker会在该镜像的最顶层加载一个读写文件系统,我们运行的程序就是在这个读写层执行的。
docker使用的是写时复制机制。
基本操作
1 | 列出镜像 |
构建镜像
1 | docker commit -m="xxx" --author="cass" xxxxxx xx/xx:tag |
Dockerfile 和 docker build
1 | mkdir static_web && cd static_web && touch Dockerfile |
1 | 编写Dockerfile |
删除镜像
1 | docker rmi |
Dockerfile指令
CMD
1 | 构建镜像后,情动容器默认执行的命令,如初始化环境,可以在run的时候被覆盖 |
ENTRYPOINT
1 | 与CMD命令有些像,但是默认不能被覆盖一般与CMD配合使用,可以配合docker run 传递参数 |
WORKDIR
1 | 可以用来切换目录,限定一些指令在目录下执行,也可以为最终的镜像设置工作目录 |
ENV
1 | 可以在镜像构建过程中设置环境变量,可以延续到以此镜像为基础的容器中,也可以用-e选项来传递环境变量 |
USER
1 | 指定启动的镜像使用的用户,默认是root |
VOLUME
1 | 指定容器启动的时候添加卷,一个卷可以存在一个或多个容器内的特定目录里面,可以实现将数据或者代码添加到镜像中而不是提交到镜像中,并且允许多个容器共享 |
ADD
1 | 用来将构建上下文中的文件或目录复制到镜像中 |
COPY
1 | COPY与ADD比较像,但是COPY不会做解压工作,只是单纯的拷贝。原路径要在构建上下文中,目标路径必须是一个绝对路径,如果目标目录不存在,会自动创建mkdir -p |
ONBUILD
1 | ONBUILD指令能为镜像添加触发器,当一个镜像被其他镜像用作基础镜像时,该镜像的触发器会被执行(如你的镜像需要从未准备好的位置添加代码,或者你需要执行特定于构建镜像的环境的构建脚本) |
在测试中使用docker
构建简单可修改的web
1 | wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/nginx/global.conf |
1 | docker build -t ooppwwqq0/nginx . |
构建sinatra应用
1 | cat Dockerfile |
构建redis
1 | cat Dockerfile |
连接到redis容器
1 | ip a show docker0 |
1 | docker inspect -f '{{ .andSettings.IPAddress }}' uredis |
以前docker的容器每次重启ip都会改变,现在好像不变了,不过使用ip来连接还是挺low的,幸运的是,docker提供了一种叫做link的功能。可以使用link的方式连接docker容器
1 | docker run -d --name uredis ooppwwqq0/uredis |
1 | cat /etc/hosts |
持续集成
构建jenkins
1 | cat Dockerfile |
1 | docker run -p 8080:8080 --name jenkins --privileged -d ooppwwqq0/udockerjenkins |
构建jekyll博客
1 | cat Dockerfile |
1 | cat Dockerfile |
1 | git clone https://github.com/jamtur01/james_blog.git |
备份jekyll卷
1 | docker run --rm --volumes-from james_blog -v $PWD:/backup ubuntu tar cvf /backup/james_blog_backup.tar /var/www/html |
使用docker构建一个java应用
- 一个镜像用来通过制定url获取war包,并且放在指定卷中
- 另一个镜像运行tomcat运行下载的war文件
1 | cat Dockerfile |
1 | cat Dockerfile |
多容器的应用栈
- 一个nodejs容器,用来运行node应用;
- 一个redis主容器,用来保存和集群化应用状态;
- 两个redis备份容器;
- 一个日志容器,用来捕捉应用日志。