# Docker安装使用和常见问题解决方案
## 1. 说明
由于公司的服务器基本都是centos 6.X的系统且内核版本为2.6.X的,而CentOS/RHEL对Docker的支持比ubuntu/Debian晚,且docker官方说明只支持内核为3.8及以上版本的内核。
因此本文主要分享自己在centos上的安装过程以及遇到的问题所提供的解决方案。并附常见命令说明,和本地目录到容器目录的映射,以及容器端口到本地端口的的映射,还有容器的生成和落地以及重新加载。
## 2. 安装准备
### 2.1 内核升级
***由于docker官方说明只支持3.8及以上版本的内核,而我们公司自己裁剪的系统基本上是2.6的内核版本,因此提供内核更新说明:***
●rpm包形式更新内核:
1)查看当前版本: uname -a
2)下载自己想要升级的内核rpm包: https://pkgs.org/download/kernel : rpm -ivh 安装;
3) 修改/etc/grub.conf的: 将default=1, 改为 default=0。(记得备份哦)。
4) reboot 重启即可。
5) 编译形式升级内核:https://www.cnblogs.com/zhunian/archive/2012/04/04/2431883.html
### 2.2 增加一个yum源
$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
### 2.3 cgroup挂载
**cgroups可以限制、记录、隔离进程组所使用的物理资源(包括:CPU、memory、IO等),为容器实现虚拟化提供了基本保证,是构建Docker等一系列虚拟化管理工具的基石。**
● **开机挂载cgroup**:
1) 首选禁用cgroup对应服务cgconfig。service cgconfig stop # 关闭服务 ;chkconfig cgconfig off # 取消开机启动
2) vim /etc/fstab;尾部添加: none /cgroup cgroup defaults 0 0 #开机挂载
## 3. 常见错误及解决方案
1) centos System error: write /cgroup/docker no space left on device
解决方法:
echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children;
echo 0 > /sys/fs/cgroup/docker/cpuset.mems;
echo 0 > /sys/fs/cgroup/docker/cpuset.cpus
2) FATA[0000] Error starting daemon: Devices cgroup isn't mounted
这个错误为cgroup在宿主机上没有挂载。
vi /etc/fstab;结尾添加: none /sys/fs/cgroup cgroup defaults 0 0;
reboot 即可。
## 4. 安装
● 安装docker: $ yum install docker-engine
● 运行docker守护进程:$ service docker start; 开机启动 $ chkconfig docker on;
● 输入docker -h,如果有输出,就证明docker在形式上已经安装成功。
## 5. docker常见命令
### 5.1 下载官方centos镜像
● 下载官方的 CentOS 镜像到本地
1) 下载官方的 CentOS 镜像到本地 : docker pull centos;
2) 确认 CentOS 镜像已经被获取: docker images centos
3) 运行一个 Docker 容器:docker run -i -t centos /bin/bash
4) 结果: [root@dbf66395436d /]#
我们可以看到,CentOS 容器已经被启动,并且我们得到了 bash 提示符。在 docker 命令中我们使用了 “-i 捕获标准输入输出”和 “-t 分配一个终端或控制台”选项。若要断开与容器的连接,输入 exit。
### 5.2 docker常见命令
#### 5.2.1 创建容器
在5.1中通过下载官方的 CentOS 镜像到本地 (docker pull centos),所以本地已经存在一个官方的REPOSITORY centos的docker镜像。(可通过docker images 命令查看)。
因此我们可以在原始的centos镜像上创建属于自己的镜像。
1)**进入镜像:** docker run -it centos:latest /bin/bash; 进入centos镜像; 现象 “[root@e2adb98cd5c2 /]# ” ,其中 e2adb98cd5c2 为新的容器id,我们在保存自己的容器时会用到。
2)**在镜像中部署自己的服务:** 进入镜像之后部署自己的服务,如果想上传本地的服务以及依赖文件。执行步骤1命令时应加入 “ -v /data:/tmp”, 即docker run -it -v /data:/tmp centos:latest /bin/bash;表示将本地的/data目录映射到容器的/tmp目录下,可将本地的服务以及依赖文件copy至本地/data下,即可在容器的/tmp目录下看到。
3)**生成镜像:** 将自己的服务部署好之后,exit退出容器。 通过“docker commit -m=”备注” 容器id imagesname”提交并生成新的镜像,可通过“docker images”查看。
#### 5.2.2 容器落地和重新加载
将自己生成的容器生成本地镜像,然后可以用这个镜像在其他的流行的linux机器上加载和运行。
1) 容器落地成镜像: docker save -o 镜像文件名 REPOSITORY; REPOSITORY为要保存的容器的名字。(可通过docker images查看)
2) 镜像重新加载成容器: docker load < 文件名 或者 docker load --input 文件; 从镜像文件载入容器像,成功之后,可通过docker images查看。
#### 5.2.3 容器的进入
一般来说,容器在我们退出之后,就停止了,如果我们要在里面运行一些后台程序怎么办呐? 我们可以让容器变成后台程序并通过ssh方式进入操作容器。
1) 首先进入容器,在容器中部署sshd服务。
● docker run -it centos:latest /bin/bash;启动docker;
● yum -y install openssh-server openssh-clients; 安装sshd;
● /usr/sbin/sshd -D; 启动sshd服务
● Could not load host key 错误处理;之后再次启动sshd服务;
1) ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
2) ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
3) ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
● 编辑/etc/ssh/sshd_config配置文件,将UsePAM yes改为no;
● passwd root; 修改root密码。
● docker commit containerid imagename; exit退出后提交镜像。
2)映射容器端口到本地的sshd服务端口即22
命令: docker run -it -d -p 20022:22 -v /data:/tmp REPOSITORY /usr/sbin/sshd -D;
参数说明: -d:让容器在后台运行。 -p 20022:22:将容器内的20022端口映射到本地22端口。-v /data:/tmp 映射本地的/data目录到容器的/tmp目录,可以作为容器里运行服务的输入输出。REPOSITORY 即为安装好sshd服务以及部署好环境的仓库名(可通过docker images查看)。
#### 5.2.4 其它命令说明
1) docker images;查看镜像ID。
2) docker ps ; 查看容器ID和运行的容器,即(CONTAINER ID)/(NAMES):
3) docker logs 容器id;在容器内使用docker logs命令,查看容器内的标准输出
4) docker stop (CONTAINER ID)/(NAMES);在容器内使用,停止容器。
5) docker top (CONTAINER ID)/(NAMES); 容器外使用,查看容器内的进程。
6) docker rm -f (CONTAINER ID)/(NAMES); 删除docker ps显示的images。
7) docker rmi -f (IMAGE ID); 删除docker images显示的images。