[博学谷学习记录]超强总结,用心分享|架构 Docker-应用容器

提示:学习笔记 欢迎指点


Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

1、初识docker

Docker为什么出现?

  • 一款产品:开发-上线 两套环境,各不相同,维护麻烦!
  • 开发–运维 开发在自己的电脑上运行良好,然后把项目打成jar包或是war包,丢给运维,运维需要配置各种环境,各种集群,压力超大,而且还很有可能失败!
  • 版本更新,导致服务不可用!
  • Docker可以把项目和它所依赖的环境整合打包,非常方便!
  • Docker的思想就来自于集装箱,应用之间相互隔离,隔离的思想
  • Docker通过隔离机制,将服务器利用到极致

2、docker命令

2.1 基础类

查看docker信息

# 查看docker版本
docker version
# 显示docker系统的信息
docker info
# 日志信息
docker logs
# 故障检查
service docker status
# 启动关闭docker
sudo service docker start|stop

2.2 日志类

查看容器日志

docker logs -f <容器名orID>

docker daemon 日志位置
也称之为 引擎日志 根据系统不同各不相同

* CoreOS - journalctl -u docker.service
* Ubuntu(16.04) - journalctl -u docker.service
* Ubuntu(14.04) - /var/log/upstart/docker.log
* Boot2Docker - /var/log/docker.log
* Debian GNU/Linux 8 - journalctl -u docker.service
* Debian GNU/Linux 7 - /var/log/daemon.log
* CentOS 7/RHEL 7 - journalctl -u docker.service
* CentOS - /var/log/daemon.log | grep docker
* Fedora - journalctl -u docker.service
* OpenSuSE - journalctl -u docker.service
* Red Hat Enterprise Linux Server - /var/log/messages | grep docker
* OSX - ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/log/d‌ocker.log

journalctl 日志工具使用

# 最后行数的日志
journalctl -n
# 详细信息
journalctl -f
# 本次启动后的所有日志
journalctl -b
# 查看启动记录
journalctl --list-boots
# 查看某次运行过程中的日志
sudo journalctl -b [启动顺序号,或者启动hash]
# 查看记录中指定单元 docker.service 的日志
journalctl -u docker.service
  • 显示可以匹配日志级别
    journalctl -F PRIORITY
    |编码| 优先级 |严重性|
    |–|–|–|
    | 0 | emerg |系统不可用 |
    | 1 | alert |必须立即采取措施 |
    | 2 | crit |严重状况 |
    | 3 | err |非严重错误状况 |
    | 4 | warning |警告状况 |
    | 5 | notice |正常但重要的事件 |
    | 6 | info |信息性事件 |
    | 7 | debug |调试级别消息 |

比如显示 docker 内核日志中 info 类的数据

# 只显示错误、冲突和重要告警信息
journalctl -u docker.service -p err..alert
# -p 等效于 PRIORITY 也可以用数字来表示
journalctl -u docker.service PRIORITY=6
# 还可以加入 MESSAGE、MESSAGE_ID、_PID、_UID、_HOSTNAME、_SYSTEMD_UNIT 等条件
# 查询字段 `man 7 systemd.journal-fields`
# 例如查询 info 信息,PID 为 2331
journalctl -u docker.service PRIORITY=6 _PID=2331

journalctl 日志保存到文件

systemd-journald 服务收集到的日志默认保存在 /run/log 目录中,重启系统会丢掉以前的日志信息

  • 保存日志到默认配置目录
    创建目录 /var/log/journal ,当这个目录存在,则日志会持久化,记得创建后,重启 systemd-journald.service 服务
sudo mkdir /var/log/journal
sudo chown root:systemd-journal /var/log/journal
sudo chmod 2775 /var/log/journal
sudo systemctl restart systemd-journald.service
  • 或者修改配置
    修改 /etc/systemd/journald.conf,把取消注释 Storage=auto, 并改为 Storage=persistent
    重启 systemd-journald.service 服务

  • 查看日志占用的磁盘空间

sudo journalctl --disk-usage

容量定义文件在 /etc/systemd/journald.conf
日志调整文件 /etc/logrotate.conf

日志系统同样会进行轮转,每月触发。默认情况下,日志大小不能超过所处文件系统的10%,也不可使所处文件系统空间低于15%

无论是否设置把日志存储到文件,都会得到 disk-usage 的占用空间!

  • 清理日志数据
#使用 –vacuum-size 选项指定日志的总体体积
sudo journalctl --vacuum-size=1G
使用 –vacuum-time 选项指定日志的总时间占用
sudo journalctl --vacuum-time=1years

docker ps 没有响应 日志查询

# grep 所有容器的config.json
docker logs [conID]
# 确认问题后
# 该config.json 中有该容器1号进程的pid
kill -9 pid

2.3 容器类

docker容器可以理解为在沙盒中运行的进程

这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。

查看容器信息

# 查看当前运行的容器
docker ps
# 查看全部容器
docker ps -a
# 查看全部容器的id和信息
docker ps -a -q
# 查看全部容器占用的空间
docker ps -as
# 查看一个正在运行容器进程,支持 ps 命令参数
docker top
# 查看容器的示例id
sudo docker inspect -f  '{{.Id}}' [id]
# 检查镜像或者容器的参数,默认返回 JSON 格式
docker inspect
# 返回 ubuntu:14.04  镜像的 docker 版本
docker inspect --format '{{.DockerVersion}}' ubuntu:14.04
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ubuntu:14.04

容器同步命令

# 保存对容器的修改
docker commit
# 保存某个容器成为一个镜像
docker commit -a "user" -m "commit info" [CONTAINER] [imageName]:[imageTag]
# 推送一个容器到中心仓库
docker login --username=[userName] --password=[pwd] [registryURL]
## 建议登录后查看 docker info
docker tag [imageID] [remoteURL]:[imageTag]
docker push [remoteURL]:[imageTag]
# 拉取提交的容器
docker pull [remoteURL]:[imageTag]
# 对比容器的改动
docker diff
# 附加到一个运行的容器上
docker attach

容器操作命令
创建删除容器

# 创建一个容器命名为 test 使用镜像daocloud.io/library/ubuntu
docker create -it --name test daocloud.io/library/ubuntu
# 创建并启动一个容器 名为 test 使用镜像daocloud.io/library/ubuntu
docker run --name test daocloud.io/library/ubuntu
# 删除一个容器
docker rm [容器id]
# 删除所有容器
docker rm `docker ps -a -q`
# 根据Dockerfile 构建
docker build -t [image_name] [Dockerfile_path]

docker容器随系统自启

docker run --restart=always
  • no – 默认值,如果容器挂掉不自动重启
  • on-failure – 当容器以非 0 码退出时重启容器,同时可接受一个可选的最大重启次数参数 (e.g. on-failure:10).
  • always – 不管退出码是多少都要重启

容器资源限制参数

# 限制内存最大使用
-m 1024m --memory-swap=1024m
# 限制容器使用CPU
--cpuset-cpus="0,1"

把一个正在运行的容器保存为镜像

docker commit <CONTAIN-ID> <IMAGE-NAME>

启动停止容器等操作

docker start|stop|restart [id]
# 暂停|恢复 某一容器的所有进程
docker pause|unpause [id]
# 杀死一个或多个指定容器进程
docker kill -s KILL [id]
# 停止全部运行的容器
docker stop `docker ps -q`
# 杀掉全部运行的容器
docker kill -s KILL `docker ps -q`

交互式进入容器

sudo docker exec -it {{containerName or containerID}} bash
sudo docker exec -i {{containerName or containerID}} bash
sudo docker exec -t {{containerName or containerID}} bash
sudo docker exec -d {{containerName or containerID}} bash
  • 只用 -i 参数,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令返回值都可以正确获取
  • 只用 -t 参数,则可以看到一个 console 窗口,但是执行命令会发现由于没有获得stdin的输出,无法看到命令执行情况
  • 使用 -it 时,则和我们平常操作 console 界面类似,而且也不会像attach方式因为退出,导致整个容器退出
  • 使用 -d 参数,在后台执行一个进程。如果一个命令需要长时间进程,会很快返回

Docker attach
Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作

docker attach {{containerName or containerID}}

需要注意的是,如果从这个stdin中exit,会导致容器的停止

查看容器的root用户密码

docker logs <容器名orID> 2>&1 | grep '^User: ' | tail -n1

因为Docker容器启动时的root用户的密码是随机分配的。所以,通过这种方式就可以得到容器的root用户的密码

容器于宿主拷贝文件

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# 本地文件上传到对应容器的目录
docker cp local.sh [CONTAINERid]:[TagPath]

此命令为高版本docker才有,当然1.11+肯定包含

运行一个新容器,同时为它命名、端口映射、文件夹映射
以redmine镜像为例

docker run --name redmine -p 9003:80 -p 9023:22 -d -v /var/redmine/files:/redmine/files -v /var/redmine/mysql:/var/lib/mysql sameersbn/redmine

一个容器连接到另一个容器

docker run -i -t --name sonar -d -link mmysql:db  tpires/sonar-server sonar

导入导出容器

# 支持远程文件 .tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz
docker import
# 导出
docker export [id] >~/Downloads/ubuntu_nexus.tar

导出后导入(exported-imported))的容器会丢失所有的提交历史,无法回滚。

2.3 镜像操作

远程镜像

docker login
docker search
# 搜索处收藏数不小于 3 ,并且能够自动化构建的  django 镜像,并且完整显示镜像描述
docker search -s 3 --automated --no-trunc django
docker pull
# 拉取ubuntu最新的镜像
docker pull ubuntu:latest
# 服务器拉取个人动态,可选择时间区间
docker events
# 拉取个人从 2015/07/20 到 2015/08/08 的个人动态
docker events --since="20150720" --until="20150808"

镜像同步操作

# 标记本地镜像,将其归入某一仓库
docker tag
# 将 ID 为 5db5f84x1261 的容器标记为 mine/lnmp:0.2 镜像
docker tag 5db5f84x1261 mine/lnmp:0.2
# 将镜像推送至远程仓库,默认为 Docker Hub
docker push

本地镜像

# 列出本地所有镜像
docker images
# 本地镜像名为 ubuntu 的所有镜像
docker images ubuntu
# 查看指定镜像的创建历史
docker history [id]
# 本地移除一个或多个指定的镜像
docker rmi
# 移除本地全部镜像
docker rmi `docker images -a -q`
# 指定镜像保存成 tar 归档文件, docker load 的逆操作
docker save
# 将镜像 ubuntu:14.04 保存为 ubuntu14.04.tar 文件
docker save -o ubuntu14.04.tar ubuntu:14.04
# 从 tar 镜像归档中载入镜像, docker save 的逆操作
docker load
# 上面命令的意思是将 ubuntu14.04.tar 文件载入镜像中
docker load -i ubuntu14.04.tar
docker load < /home/save.tar
# 构建自己的镜像
docker build -t <镜像名> <Dockerfile路径>
docker build -t xx/gitlab .

保存后再加载(saved-loaded)的镜像不会丢失提交历史和层,可以回滚

重新查看container的stdout

# 启动top命令,后台运行
$ ID=$(sudo docker run -d ubuntu /usr/bin/top -b)
# 获取正在running的container的输出
$ sudo docker attach $ID
top - 02:05:52 up  3:05,  0 users,  load average: 0.01, 0.02, 0.05
Tasks:  1 total,  1 running,  0 sleeping,  0 stopped,  0 zombie
Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    373572k total,  355560k used,    18012k free,    27872k buffers
Swap:  786428k total,        0k used,  786428k free,  221740k cached
^C$
$ sudo docker stop $ID

docker run
后台运行(-d)、并暴露端口

docker run -d -p 127.0.0.1:33301:22 centos6-ssh

run 命令详解

-a, --attach=[]            Attach to STDIN, STDOUT or STDERR 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
  --add-host=[]              Add a custom host-to-IP mapping (host:ip)
  --blkio-weight=0            Block IO (relative weight), between 10 and 1000
  -c, --cpu-shares=0          CPU shares (relative weight)
  --cap-add=[]                Add Linux capabilities
  --cap-drop=[]              Drop Linux capabilities
  --cgroup-parent=            Optional parent cgroup for the container
  --cidfile=                  Write the container ID to the file
  --cpu-period=0              Limit CPU CFS (Completely Fair Scheduler) period
  --cpu-quota=0              Limit the CPU CFS quota
  --cpuset-cpus=              CPUs in which to allow execution (0-3, 0,1) 绑定容器到指定CPU运行
  --cpuset-mems=              MEMs in which to allow execution (0-3, 0,1) 绑定容器到指定MEM运行
  -d, --detach=false          Run container in background and print container ID 后台运行容器,并返回容器ID
  --device=[]                Add a host device to the container
  --dns=[]                    Set custom DNS servers 指定容器使用的DNS服务器,默认和宿主一致
  --dns-search=[]            Set custom DNS search domains 指定容器DNS搜索域名,默认和宿主一致
  -e, --env=[]                Set environment variables 设置环境变量
  --entrypoint=              Overwrite the default ENTRYPOINT of the image
  --env-file=[]              Read in a file of environment variables 从指定文件读入环境变量
  --expose=[]                Expose a port or a range of ports
  -h, --hostname=            Container host name 指定容器的hostname
  --help=false                Print usage
  -i, --interactive=false    Keep STDIN open even if not attached 以交互模式运行容器,通常与 -t 同时使用
  --ipc=                      IPC namespace to use
  -l, --label=[]              Set meta data on a container
  --label-file=[]            Read in a line delimited file of labels
  --link=[]                  Add link to another container
  --log-driver=              Logging driver for container
  --log-opt=[]                Log driver options
  --lxc-conf=[]              Add custom lxc options
  -m, --memory=              Memory limit
  --mac-address=              Container MAC address (e.g. 92:d0:c6:0a:29:33)
  --memory-swap=              Total memory (memory + swap), '-1' to disable swap
  --name=                    Assign a name to the container 为容器指定一个名称
  --net=bridge                Set the Network mode for the container  指定容器的网络连接类型,支持 bridge/host/none/container:<name|id> 四种类型
  --oom-kill-disable=false    Disable OOM Killer
  -P, --publish-all=false    Publish all exposed ports to random ports
  -p, --publish=[]            Publish a container's port(s) to the host
  --pid=                      PID namespace to use
  --privileged=false          Give extended privileges to this container
  --read-only=false          Mount the container's root filesystem as read only
  --restart=no                Restart policy to apply when a container exits
  --rm=false                  Automatically remove the container when it exits
  --security-opt=[]          Security Options
  --sig-proxy=true            Proxy received signals to the process
  -t, --tty=false            Allocate a pseudo-TTY 为容器重新分配一个伪输入终端,通常与 -i 同时使用
  -u, --user=                Username or UID (format: <name|uid>[:<group|gid>])
  --ulimit=[]                Ulimit options
  --uts=                      UTS namespace to use
  -v, --volume=[]            Bind mount a volume
  --volumes-from=[]          Mount volumes from the specified container(s)
  -w, --workdir=              Working directory inside the container

存在的问题解决方法
去除每次sudo运行docker命令,需要添加组

# Add the docker group if it doesn't already exist.
$ sudo groupadd docker
#改完后需要重新登陆用户
$ sudo gpasswd -a ${USER} docker

Dockerfile中的EXPOSE、docker run --expose、docker run -p之间的区别

  • Dockerfile的EXPOSE相当于docker run --expose,提供container之间的端口访问
  • docker run -p允许container外部主机访问container的端口

注意
ubuntu14 的 febootstrap没有 -i 命令
ubuntu14下的docker是没有service服务

3、docker容器数据卷

3.1 简介

看Docker的理念:

  • 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
  • 容器之间希望有可能共享数据

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据,在docker中我们使用卷

​卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除其挂载的数据卷,特点:

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

3.2 数据卷

  • 直接命令添加

    • 命令
      docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

    • 查看数据卷是否挂载成功

    • 容器和宿主机之间数据共享

    • 容器停止退出后,主机修改后数据完全同步

    • 命令(带权限)
      docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

  • DockerFile添加

    • 根目录下新建mydocker文件夹并进入
    • 可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
    • File构建
    • build后生成镜像
    • run容器
    • 通过上述步骤,容器内的卷目录地址已经知道对应的主机目录地址在哪
    • 主机对应默认地址

3.3 数据卷容器

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称为数据卷容器
容器间传递共享(–volumes-from)

----结束----

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值