Docker安装使用和常见问题解决方案

# 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。

你可能感兴趣的:(Docker安装使用和常见问题解决方案)