Docker容器基础认知
## 一、 [docker](http://www.itxdm.me/archives/tag/docker/)概念
[Docker](http://www.itxdm.me/wp-content/plugins/YZ-Link/go.php?url=aHR0cDovL2xpYi5jc2RuLm5ldC9iYXNlLzQ=)包括三个基本概念:镜像(Image)、容器([Container](http://www.itxdm.me/wp-content/plugins/YZ-Link/go.php?url=aHR0cDovL2xpYi5jc2RuLm5ldC9iYXNlLzQ=))、仓库(Repository)
### 镜像
在此基础上对该镜像进行二次改造,大家可以使用该镜像来扩展开发。
### 容器
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间、网络空间等)和运行在其中的应用程序。
### 仓库
国内知名仓库dockerpool和docker.cn了
docerpoll : [http://www.dockerpool.com/](http://www.itxdm.me/wp-content/plugins/YZ-Link/go.php?url=aHR0cDovL3d3dy5kb2NrZXJwb29sLmNvbS8=)
docker.cn : [https://docker.cn](http://www.itxdm.me/wp-content/plugins/YZ-Link/go.php?url=aHR0cHM6Ly9kb2NrZXIuY24v)/
## 二、docker 安装
1、安装所有必须和可选的包,升级包管理器,然后再安装它。
sudo apt-get update ; sudo apt-get install linux-image-generic-lts-trusty ; sudo reboot
2、获取最新版本的 Docker 安装包
$ **wget -qO- https://get.docker.com/ | sh**
3、验证 Docker 是否被正确的安装
$ sudo docker run hello-world <== 安装hello-world镜像
$ sudo docker images <== 查看安装情况。
4、如何开启停止docker
sudo stop/start/restart docker
5、升级docker
$ sudo apt-get install -y lxc-docker
$ sudo docker version <== 查看docker版本
6、运行docker
sudo docker run -i -t centos /bin/bash
-i:打开容器中的STDIN
-t:为容器分配一个伪tty终端
参考文章:
**https://github.com/widuu/chinese_docker/blob/master/installation/ubuntu.md#Ubuntu%E5%AE%89%E8%A3%85Docker**
[http://blog.csdn.net/u010397369/article/details/40981673](http://www.itxdm.me/wp-content/plugins/YZ-Link/go.php?url=aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDM5NzM2OS9hcnRpY2xlL2RldGFpbHMvNDA5ODE2NzM=)
------
##三、docker 使用
关于本人作为小白使用的一些感悟和发现,这里分享给大家:
### 范例
docker run --restart always -p 22333:22 -itd registry.cn-hangzhou.aliyuncs.com/loutian/centos6 /bin/bash
### 参数
1、docker pull 用于拉取并保存 docker image 信息
2、docker ps 用于查询 docker 运行情况( 比如说有多少个 images 多少个images_ID ,常于 -a 连用)
3、docker run 用于运行 pull 过的 docker images (但是注意需要一些可选项做支持,类似上面的范例)
4、docker attach 可用于对 “ --restart always ” 可选项得进入
5、docker start 如上,区别是使用 “ docker attach ” 前需要开启 images_ID (默认docker inspect关闭)
6、docker inspect 用于显示相信 docker 信息 (一般使用实例为: docker inspect registry.cn-hangzhou.aliyuncs.com/acs-sample/centos | grep “需要的信息” )
7、docker exec 类似 docker run 暂不清楚区别( 范例为 docker exec -it “images_ID” /bin/bash )
### 一些可选项
-d 表示后台运行
-p 用于映射本机和docker的端口
--net=host 将docker网络与本机进行绑定
-it 用于指定 images 并指定 shell
--restart always 不多生成images_ID (该项多与 -d 连用)
#### 一些不确定:
-e "container=docker" 字面上的意思是说自己是个容器,不知道有什么意义
--privileged 不知名的选项,据说可以解决 systemctl 无法使用的问题,然而卵。
- docker容器默认移除sys_resource(Linux能力),因而ulimit -n设置只能改小无法改大,改大会报错:ulimit: open files: cannot modify limit: Operation not permitted。
- 红帽7下docker run可以使用–privileged选项来不移除Linux能力,但docker默认移除这个Linux能力肯定是有安全方面的考量,因此尽量别用该选项
echo "DOCKER_OPTS=\"--registry-mirror=https://4jeyqgqz.mirror.aliyuncs.com\"" | sudo tee -a /etc/default/docker sudo service docker restart
据说可以利用阿里进行加速,有风险测试貌似无效。
-----
## 四、Docker Ubuntu的配置
###Ubuntu Docker可选配置
这部分主要介绍了 Docker 的可选配置项,使用这些配置能够让 Docker 在 Ubuntu 上更好的工作。
- 创建 Docker 用户组
- 调整内存和交换空间(swap accounting)
- 启用防火墙的端口转发(UFW)
- 为 Docker 配置DNS服务
### 创建 Docker 用户组
docker 进程通过监听一个 Unix Socket 来替代 TCP 端口。在默认情况下,docker 的 Unix Socket属于`root`用户,当然其他用户可以使用`sudo`方式来访问。因为这个原因, docker 进程就一直是`root`用户运行的。
为了在使用 `docker` 命令的时候前边不再加`sudo`,我们需要创建一个叫 `docker` 的用户组,并且为用户组添加用户。然后在`docker` 进程启动的时候,我们的 `docker` 群组有了 Unix Socket 的所有权,可以对 Socket 文件进行读写。
> 注意:`docker` 群组就相当于root用户。有关系统安全影响的细节,请查看 [Docker 进程表面攻击细节](http://www.itxdm.me/wp-content/plugins/YZ-Link/go.php?url=aHR0cHM6Ly9naXRodWIuY29tL3dpZHV1L2NoaW5lc2VfZG9ja2VyL2Jsb2IvbWFzdGVyL2luc3RhbGxhdGlvbg==)
创建 `docker` 用户组并添加用户
1. 使用具有`sudo`权限的用户来登录你的Ubuntu。在这过程中,我们假设你已经登录了Ubuntu。
2. 创建 `docker` 用户组并添加用户。`$ sudo usermod -aG docker ubuntu`
3. 注销登录并重新登录这里要确保你运行用户的权限。
4. 验证 `docker` 用户不使用 `sudo` 命令开执行 `Docker``$ docker run hello-world`
### 调整内存和交换空间(swap accounting)
当我们使用 Docker 运行一个镜像的时候,我们可能会看到如下的信息提示:
```
WARNING: Your kernel does not support cgroup swap limit. WARNING: Your
kernel does not support swap limit capabilities. Limitation discarded.、
```
为了防止以上错误信息提示的出现,我们需要在系统中启用内存和交换空间。我们需要修改系统的 GUN GRUB (GNU GRand Unified Bootloader) 来启用内存和交换空间。开启方法如下:
1. 使用具有`sudo`权限的用户来登录你的Ubuntu。
2. 编辑 `/etc/default/grub` 文件
3. 设置 `GRUB_CMDLINE_LINUX` 的值如下:`GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"`
4. 保存和关闭文件
5. 更新 GRUB
```
$ sudo update-grub
```
6. 重启你的系统。
### 允许UFW端口转发
当你在运行 `docker` 的宿主主机上使用UFW(简单的防火墙)。你需要做一些额外的配置。Docker 使用桥接的方式来管理网络。默认情况下,UFW 过滤所有的端口转发策略。因此,当在UFW启用的情况下使用`docker` ,你必须适当的设置UFW的端口转发策略。
默认情况下UFW是过滤掉所有的入站规则。如果其他的主机能够访问你的容器。你需要允许Docker的默认端口(2375)的所有连接。
设置 UFW 允许Docker 端口的入站规则:
1. 使用具有`sudo`权限的用户来登录你的Ubuntu。
2. 验证UFW的安装和启用状态
```
$ sudo ufw status
```
3. 打开和编辑`/etc/default/ufw`文件`$ sudo nano /etc/default/ufw`
4. 设置 `DEFAULT_FORWARD_POLICY` 如下:DEFAULT_FORWARD_POLICY=”ACCEPT”
5. 保存关闭文件。
6. 重新加载UFW来使新规则生效。
```
$ sudo ufw reload
```
7. 允许 Docker 端口的入站规则
```
$ sudo ufw allow 2375/tcp
```
### Docker 配置 DNS 服务
无论是Ubuntu还是Ubuntu 桌面繁衍版在系统运行的时候都是使用`/etc/resolv.conf`配置文件中的127.0.0.1作为域名服务器(nameserver)。NetworkManager设置dnsmasq使用真实的dns服务器连接,并且设置 /etc/resolv.conf的域名服务为127.0.0.1。
在桌面环境下使用这些配置来运行 docker 容器的时候, Docker 用户会看到如下的警告:
```
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers
can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
```
该警告是因为 Docker 容器不能使用本地的DNS服务。相反 Docker 使用一个默认的外部域名服务器。
为了避免此警告,你可以给 Docker 容器指定一个DNS服务器。或者你可以禁用 NetworkManager 的 `dnsmasq`。不过当禁止`dnsmasq` 可能使某些网络的DNS解析速度变慢。
为 Docker 指定一个DNS服务器
1. 使用具有`sudo`权限的用户来登录你的Ubuntu。
2. 打开并编辑 `/etc/default/docker``$ sudo nano /etc/default/docker`
3. 添加设置
```
DOCKER_OPTS="--dns 8.8.8.8"
```
使用8.8.8.8替换如192.168.1.1的本地DNS服务器。你可以指定多个DNS服务器,多个DNS服务器使用空格分割例如
```
--dns 8.8.8.8 --dns 192.168.1.1
```
> 警告:如果你正在使用的电脑需要连接到不同的网络,一定要选择一个公共DNS服务器。
4. 保存关闭文件。
5. 重启 Docker 进程
```
$ sudo restart docker
```
或者,作为替代先前的操作过程,禁止NetworkManager中的`dnsmasq`(这样会使你的网络变慢)
1. 打开和编辑 `/etc/default/docker``$ sudo nano /etc/NetworkManager/NetworkManager.conf`
2. 注释掉 dns = dsnmasq:
```
dns=dnsmasq
```
3. 保存关闭文件
4. 重启NetworkManager 和 Docker
```
$ sudo restart network-manager $ sudo restart docker
```
### 升级Docker
在`wget`的时候使用`-N`参数来安装最新版本的Docker:
```
$ wget -N https://get.docker.com/ | sh
```
Docker容器基础认知的更多相关文章
- docker容器基础
一.docker容器基础6种名称空间:UTS.MOunt.IPC.PID.User.Net (1) Linux Namespaces:namespace 系统调用参数 隔离内容 内核版本 UTS ...
- Docker容器基础入门认知-网络篇
这篇文章中,会从 docker 中的单机中的 netns 到 veth,再到单机多个容器之间的 bridge 网络交互,最后到跨主机容器之间的 nat 和 vxlan 通信过程,让大家对 docker ...
- Docker容器基础知识学习
Docker作为操作系统层面的轻量级的虚拟化技术,凭借简易的使用.快速的部署以及灵活敏捷的集成等优势,迅速发展目前最为火热的技术. 1.云计算服务是一种资源管理的资源服务,该模式可以实现随时随地.便捷 ...
- Docker 容器安装及常用基础命令
为什么用docker 作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势. Docker 在如下几个方面具有较大的优势: 更快速的交付和部署 Docker在整个开发周期都可以 ...
- Docker容器学习梳理 - 基础知识(1)
Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源.Docker是通过内核虚拟化技 ...
- Docker容器技术-基础命令
一.基础命令 1.运行一个镜像 [root@bogon ~]# docker run debian echo "Hello World" Unable to find image ...
- 容器基础(一): Docker介绍
IaaS IaaS阶段, 用户租借基础设施,但是还是需要像以前管理服务器那样,用脚本或者手工方式在这些机器上部署应用.这个过程中当然难免会碰到云端机器和本地机器环境不一致的问题.想想每一次同步不同机器 ...
- URLOS开发基础教程——docker容器的使用方法
URLOS本是基于docker容器运行,在入门URLOS开发之前,我们首先需要掌握docker的相关基础知识,本篇就以docker容器的基本使用方法为例,快速的让大家对docker有一个全面的印象. ...
- docker容器技术基础之联合文件系统OverlayFS
我们在上篇介绍了容器技术中资源隔离与限制docker容器技术基础之linux cgroup.namespace 这篇小作文我们要尝试学习容器的另外一个重要技术之联合文件系统之OverlayFS,在介绍 ...
随机推荐
- git本地代码库回滚(webstorm下)
git本地代码库回滚(webstorm下) 1. 场景 添加了一个文件[file-for-test.js]到git的控制下(并没有push到远程分支上) 进行了三次修改,并分别进行了三次commit( ...
- 这几天搞UNITY遇到的坑
都是在IPHONE设备上遇到的,UNITY版本是5.4.4f1 1.EASY AR出现扫描蓝线绿块的,是因为不是EASY AR的CameraDeviceBehavior默认参数1280X720 2.自 ...
- ubuntu下搭建android开发环境
注意: google可能被和谐了,那就修改hosts sudo vim /etc/hosts 增加: #Google主页 203.208.46.146 www.google.com #这行是为了方便打 ...
- smarty 使用php函数
strtotime() time() <{if strtotime($activity.start_time) gt time()}> <a href="?action=d ...
- Spring查询方法的注入 为查询的方法注入某个实例
//这里是客户端的代码 当调用CreatePersonDao这个抽象方法或者虚方法的时候由配置文件返回指定的实例 为查询的方法注入某个实例 start static void Main(string[ ...
- AutoComplete的extraParams动态传递参数
AutoComplete可利用extraParams传递参数,如 extraParams:{para1:'参数1',para2:'参数2'} 但是,如需动态取值作为参数值时却无法达到期望目的,可改为配 ...
- <<C++标准程序库>>中的STL简单学习笔记
0. 内容为个人学习笔记, 仅供参考, 如有错漏, 欢迎指正! 1. STL中的所有组件都是由模板构成的, 所以其元素可以是任意型别的. 组件有: - 容器: 管理某类对象的集合. 不同的容器有各自的 ...
- 3.3.5 高效读取:不变模式下的CopyOnWriteArrayList
源码分析:读写(get,add) 一:get 方法 private E get(Object[] a, int index) { return (E) a[index];}可以看到读取数据的时候 没有 ...
- eclipse Subversion Native Library Not Available
参考:http://blog.csdn.net/zp357252539/article/details/44880319 Subversion Native Library Not Available ...
- 'for each' statements are only available if source level is 5.0
在用foreach的时候,出现以下错误: 错误:Syntax error, 'for each' statements are only available if source level is 5. ...