docker 简单入门

docker 部署

标签(空格分隔): docker


系统
centos6.8 mini

docker 官方文档
https://docs.docker.com/engine/installation/linux/centos/

安装docker

安装EPEL

因为系统自带的repo中不带Docker需要安装epel

rpm -Uvh http://ftp.riken.jp/Linux/fedora/epel/6Server/x86_64/epel-release-6-8.noarch.rpm

安装docker

yum install -y docker-io

开机自启动与启动Docker

service docker start
chkconfig docker on
chkconfig docker --list

docker使用

Docker有什么作用?

Docker容器打包软件到一个包含了所有运行所需环境(代码、运行时状态、系统工具、系统库——任何可以被安装在服务器上的环境)的文件系统里,这样软件无论被迁移到哪里都是同样的运行环境。
通俗来说就是开发环境如果没有问题,用Docker打包成容器在服务器上运行,至少不会遇到环境问题。
还有像我这样使用Mac开发的程序员,如果需要开发oracle数据库,本地是无法安装oracle的,可以通过docker运行一个oracle镜像。

Docker的特点

轻量性
运行在一台机器上的容器共享其操作系统内核,它们启动使用更少的内存。Docker的镜像文件可以通过分层的文件系统及共享的公共文件创建(说白了就是Docker的镜像文件可以在其他镜像基础上创建并且还可以共享使用其他镜像或操作系统的文件,这样镜像文件就很小),节省磁盘空间并提高下载效率。


开放性
Docker容器基于开放标准,使容器能够在所有的主流Linux及windows或者其他设备的顶层运行。


默认安全性
容器隔离彼此和基础架构应用,同时为应用程序提供了额外的保护层。

docker概念

镜像(Image)
容器(Container)
仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期。

镜像
镜像是只读的。
镜像可以想象成操作系统的安装镜像(例如CentOS6.8.ISO)。

容器
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以理解成 我们通过镜像安装操作系统,我们可以开机,关机,等操作。

仓库
仓库是集中存放镜像文件的场所。
有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。
实际上,仓库注册服务器上往往存放着多个仓库。
每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

一个仓库中可能有centos ubuntu fedora等镜像,然后ubuntu可以有12 13 15 16等版本则使用标签标明。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

镜像操作

获取镜像

** 从 Docker Hub 获取镜像**

https://hub.docker.com/ 
Paste_Image.png
Paste_Image.png
Paste_Image.png

** 从hub.daocloud.io 获取镜像**
地址:http://hub.daocloud.io/

Paste_Image.png

时速云镜像中心
https://hub.tenxcloud.com/

Paste_Image.png

从网易蜂巢镜像下获取镜像
https://c.163.com/hub#/m/home/

docker pull hub.c.163.com/library/tomcat:latest
Paste_Image.png
Paste_Image.png
Paste_Image.png

通过命令行搜索

docker search tomcat

下载镜像
在命令行模式下键入以下命令

docker pull tomcat

查看本地镜像列表
在命令行模式下键入以下命令

docker images

删除本地镜像
在命令行模式下键入以下命令,需要 image id 来指定删除的镜像

docker rmi [image id]

容器操作

启动镜像成容器
在命令行模式下键入以下命令

docker run -it --rm -p 8888:8080 tomcat:latest

其中“-it”代表开启交互功能,即容器内tomcat启动日志你将能看到。
其中“—rm”代表当启动的容器停止后自动删除该容器(不是镜像哦)。
其中“-p 8888:8080”代表将容器中的8080端口映射到本地机器的8888端口上,即我们可以通过localhost:8888端口访问到tomcat,甚至我可以改变本地端口来启动多个tomcat容器。
最后的“tomcat:latest”代表启动的容器名称及其版本标签。
该条启动命令可以在Docker Hub上该镜像的详细说明中查看,其中会有多种启动方式说明

查看运行中的容器ID
在命令行模式下键入以下命令

docker ps

其中“container id”为容器编号,下面的操作将与它相关

进入运行中的容器内部执行命令
有时容器的设置并不能满足我们的需要,比如,我们可能需要增加一个tomcat用户,或是配置一个数据源连接池等,需要进入容器中修改参数,下面我们就介绍下如何进入容器中。
在命令行模式下键入以下命令

docker exec -it [container id] /bin/bash

停止运行中的容器
在命令行模式下键入以下命令

docker stop [container id]

查看停止状态的容器
在命令行模式下键入以下命令

docker ps -a

启动停止状态的容器
在命令行模式下键入以下命令

docker start [container id]

删除的容器
在命令行模式下键入以下命令

docker rm [container id]

提交容器成为新的镜像
在命令行模式下键入以下命令

docker commit [container id] [your name]/[image name]:[tag]

其中“[container id]”在执行时替换为具体容器的“container id”
其中“[your name]”在执行时替换为你的名字,方便大家知道是你做的镜像
其中“[image name]”在执行时替换为你希望的镜像名称
其中“[tag]”在执行时替换为你的镜像的版本,也可以不指定
详细“docker commit”说明请参考docker官网-文档-commit

导出镜像
在命令行模式下键入以下命令

docker save [image name] > [local file name].tar

其中“[container id]”在执行时替换为具体镜像的名字
其中“[local file name]”在执行时替换为你想取的本地文件名

载入镜像

在命令行模式下键入以下命令

docker load < [local file full name]

其中“[local file full name]” 在执行时替换为本地文件名(含扩展名)


常用命令

镜像管理

docker images:列出本地所有镜像
docker search <IMAGE_ID/NAME>:查找image
docker pull <IMAGE_ID>:下载image
docker push <IMAGE_ID>:上传image
docker rmi <IMAGE_ID>:删除image

容器管理

docker run -i -t <IMAGE_ID> /bin/bash:-i:标准输入给容器 -t:分配一个虚拟终端 /bin/bash:执行bash脚本
-d:以守护进程方式运行(后台)
-P:默认匹配docker容器的5000端口号到宿主机的49153 to 65535端口
-p <HOT_PORT>:<CONTAINER_PORT>:指定端口号

  • -name: 指定容器的名称
  • -rm:退出时删除容器

docker stop <CONTAINER_ID>:停止container
docker start <CONTAINER_ID>:重新启动container
docker ps - Lists containers.
-l:显示最后启动的容器
-a:同时显示停止的容器,默认只显示启动状态

docker attach <CONTAINER_ID> 连接到启动的容器
docker logs <CONTAINER_ID> : 输出容器日志
-f:实时输出
docker cp <CONTAINER_ID>:path hostpath:复制容器内的文件到宿主机目录上
docker rm <CONTAINER_ID>:删除container
docker rm docker ps -a -q:删除所有容器
docker kill docker ps -q
docker rmi docker images -q -a
docker wait <CONTAINER_ID>:阻塞对容器的其他调用方法,直到容器停止后退出

docker top <CONTAINER_ID>:查看容器中运行的进程
docker diff <CONTAINER_ID>:查看容器中的变化
docker inspect <CONTAINER_ID>:查看容器详细信息(输出为Json)
-f:查找特定信息,如docker inspect -f '{{ .NetworkSettings.IPAddress }}'
docker commit -m "comment" -a "author" <CONTAINER_ID> ouruser/imagename:tag
docker extc -it <CONTAINER> <COMMAND>:在容器里执行命令,并输出结果

网络管理

docker run -P:随机分配端口号
docker run -p 5000:5000:绑定特定端口号(主机的所有网络接口的5000端口均绑定容器的5000端口)
docker run -p 127.0.0.1:5000:5000:绑定主机的特定接口的端口号
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py:绑定udp端口号
docker port <CONTAINER_ID> 5000:查看容器的5000端口对应本地机器的IP和端口号
使用Docker Linking连接容器:

Docker为源容器和接收容器创建一个安全的通道,容器之间不需要暴露端口,接收的容器可以访问源容器的数据
docker run -d -P --name <CONTAINER_NAME> --link <CONTAINER_NAME_TO_LINK>:<ALIAS>

数据管理

Data Volumes:volume是在一个或多个容器里指定的特殊目录

  • 数据卷可以在容器间共享和重复使用
  • 可以直接修改容器卷的数据
  • 容器卷里的数据不会被包含到镜像中
  • 容器卷保持到没有容器再使用它
    可以在容器启动的时候添加-v参数指定容器卷,也可以在Dockerfile里用VOLUMN命令添加
    docker run -d -P --name web -v /webapp training/webapp python app.py
    也可以将容器卷挂载到宿主机目录或宿主机的文件上,<容器目录或文件>的内容会被替换为<宿主机目录或文件>的内容,默认容器对这个目录有可读写权限
    docker run -d -P --name web -v <宿主机目录>:<容器目录> training/webapp python app.py
    可以通过指定ro,将权限改为只读
    docker run -d -P --name web -v <宿主机目录>:<容器目录>:ro training/webapp python app.py
    在一个容器创建容器卷后,其他容器便可以通过--volumes-from共享这个容器卷数据,如下:
    docker run -d -v /dbdata --name db1 training/postgres echo Data-only container for postgres
    首先启动了一个容器,并为这个容器增加一个数据卷/dbdata,然后启动另一个容器,共享这个数据卷
    docker run -d --volumes-from db1 --name db2 training/postgres
    此时db2使用了db1的容器卷,当容器db1被删除时,容器卷也不会被删除,只有所有容器不再使用此容器卷时,才会被删除
    docker rm -v:删除容器卷
    除了共享数据外,容器卷另一个作用是用来备份、恢复和迁移数据
    docker run --volumes-from db1 -v /home/backup:/backup ubuntu tar cvf /backup/backup.tar /dbdata
    启动一个容器数据卷使用db1容器的数据卷,同时新建立一个数据卷指向宿主机目录/home/backup,将/dbdata目录的数据压缩为/backup/backup.tar
    docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
    docker run --volumes-from dbdata2 -v /home/backup:/backup busybox tar xvf /backup/backup.tar
    启动一个容器,同时把backup.tar的内容解压到容器的backup

错误

  • Cannot connect to the Docker daemon. Is 'docker -d' running on this host?
    1、系统内核低于3.x的更新内核

系统内核更新方法
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
查看当前系统内核:
uname -r / uname -a(所有信息)
根据本地CentOs版本进行下载对应的Elrepo
CentOS 6x版本:
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
CentOS 7x版本:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
升级内核
注意:在Elrepo源中有两个版本的内核;一个是长期稳定支持版本,一个是线上最新版本;如果你想安装最新的版本则升级线上最新版本即可;
长期支持版本:
yum --enablerepo=elrepo-kernel install kernel-lt -y
线上最新版本:
yum --enablerepo=elrepo-kernel install kernel-ml -y
更换启动项文件
更新grub.conf
vi /etc/grub.conf
把default从default=1修改为default=0即可;
直接reboot并查看新内核版本

2、检查权限
3、重启docker
service docker

  • Docker容器内存限制

1.使用docker自带的-m操作进行内存限制时可能会由于内核限制所以出现以下提示
Your kernel does not support swap limit capabilities.memory limit without swap
必须通过修改grub文件/etc/default/grub 添加:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
之后更新grub并重启可以解决
$ sudo update-grub
$ sudo reboot
2.使用docker -m操作会使内存被限制为输入大小的两倍
$ sudo docker run -it --name test -m 100m ubuntu /bin/bash
此时内存被限制为200m
若想要限制为100m必须执行
$ sudo docker run -it --name test -m 100m --memory-swap=100m ubuntu /bin/bash
此时内存与swap都被限制为100m
3.内存压测工具stress
$ sudo apt-get install stress
$ sudo stress --vm 1 --vm-bytes 100M --vm-hang 0
若运行后现实在几秒内被杀死说明内存被限制为100M

推荐阅读更多精彩内容

  • Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。在本文中,将分享容器...
    聂扬帆博客阅读 106评论 0 1
  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 11,085评论 17 145
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 6,302评论 0 115
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 655评论 0 7
  • 北河街是老街。路面坑坑洼洼,时有一角砖头翘起。街边的房子要不墙面剥落斑驳,露出干红泥墙;要不就是木房子,老...
    YA花阅读 78评论 0 0