一、前言

  以前我们如果想在windows环境下使用linux系统,最早的是一台主机上安装双机系统,再后来我们有了VMware,可以通过workstations虚拟化平台安装虚拟机。现在我们还可以通过docker安装linux容器,容器更轻量也更便捷。不过凡事都是两面性的,因为容器的轻量,所以linux虚拟机默认就有的很多服务和命令都是没有的。我们以centos7容器为例介绍centos7容器常用命令和服务的安装。我们首先拉取一个centos7最新版镜像文件并启动容器。

#拉取centos7镜像
 [root@test ~]# docker pull centos:centos7
 #创建centos7容器,run表示运行一个容器,-itd表示后台运行,–name设置容器名称,–restart=always表示容器随docker服务自启动
 [root@test ~]# docker run -itd --name centos7 --restart=always centos:centos7 /usr/sbin/init
 #登录容器
 [root@test ~]# docker exec -it centos7 /bin/bash

二、centos7容器常用命令安装

1、ip命令安装

#安装命令前
 [root@4167e92716bf /]# ip addr
 bash: ip: command not found
 #安装命令软件包
 [root@4167e92716bf /]# yum install -y iproute
 #安装命令后
 [root@4167e92716bf /]# ip addr
 …
 inet 172.17.0.3/16 scope global eth0

2、netstat命令安装

  

netstat、route、ifconfig等命令都是net-tools工具包里的命令。
#安装命令前
 [root@4167e92716bf /]# netstat -tnpl
 bash: netstat: command not found
 #安装命令软件包
 [root@4167e92716bf /]# yum install -y net-tools
 #安装命令后
 [root@4167e92716bf /]# netstat -tnpl
 …
 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 149/sshd

3、vim命令安装

[root@4167e92716bf /]# yum install -y vim

4、其他命令安装

  linux环境下命令安装相对简单,找不到的命令我们通过yum安装即可,有些命令软件包就是命令名称,有些是合集,通过百度查找到对应软件包名进行安装即可。

[root@4167e92716bf /]# yum install -y wget

三、centos7容器常用服务安装

1、sshd服务安装

  centos7容器默认没有安装和启动ssh服务的,如果我们希望远程登录容器,则需要安装并配置启动sshd服务。结合容器随docker服务启动,就可以实现远程连接docker了。

#安装sshd服务
 [root@4167e92716bf /]# yum install -y openssh-server
 #启动sshd服务
 [root@4167e92716bf /]# systemctl start sshd
 #设置开机自启动
 [root@4167e92716bf /]# systemctl enable sshd

2、创建用户

  直接创建的centos7容器,默认是没有创建用户的,如果我们想要远程管理,还需要创建用户,用于登录验证。

[root@4167e92716bf /]# useradd wuhs
 [root@4167e92716bf /]# passwd wuhs
 Changing password for user wuhs.
 New password:
 BAD PASSWORD: The password is shorter than 8 characters
 Retype new password:
 passwd: all authentication tokens updated successfully.

3、安装ssh客户端

  安装sshd服务只是用于远程管理,如果想从容器远程其他主机则需要安装ssh客户端。

[root@4167e92716bf /]# yum install -y openssh-clients

4、安装vsftpd服务

  直接yum安装vsftpd服务,通过systemctl管理服务启停。

[root@4167e92716bf /]# yum install -y vsftpd

5、安装httpd服务

  直接yum安装httpd服务,通过systemctl管理服务启停。

[root@4167e92716bf /]# yum install -y httpd

6、安装其他服务

  如果是yum安装的服务,我们可以自己安装;如果是linux环境下按步骤部署的我们也可以像虚拟机环境下一样正常部署安装。

[root@4167e92716bf local]# yum install -y lrzsz
 [root@4167e92716bf local]# source /etc/profile
 [root@4167e92716bf local]# java -version
 java version “1.8.0_291”
 Java™ SE Runtime Environment (build 1.8.0_291-b10)
 Java HotSpot™ 64-Bit Server VM (build 25.291-b10, mixed mode)

四、QA

1、启动sshd服务的时候报错

  • 报错信息:Failed to get D-Bus connection: Operation not permitted
  • 报错原因:创建容器的时候未启用
  • 解决方案一:在创建CentOS 7容器时,使用"/usr/sbin/init"参数,容器会启动systemd作为其初始化进程,从而使容器能够像一个完整的操作系统一样运行,并能够管理和启动其他服务和进程。这个时候使用systemctl start sshd方式启动进程。
  • 解决方案二:使用sshd命令直接启动服务

[root@22ba481dca87 ssh]# /usr/sbin/sshd -D &

2、sshd命令启动服务的时候报错

  • 报错信息:Could not load host key: /etc/ssh/ssh_host_rsa_key…sshd: no hostkeys available – exiting.
  • 报错原因:缺少ssh的主机密钥文件
  • 解决方案:重新生成所有缺失的主机密钥文件,然后启动
[root@22ba481dca87 ssh]# ssh-keygen -A
 ssh-keygen: generating new host keys: RSA1 RSA DSA ECDSA ED25519
 [root@22ba481dca87 ssh]# /usr/sbin/sshd -D &

五、已启动容器添加映射端口

  凡事有利有弊,docker容器轻量便捷了,但是如果新部署了服务,监听了端口,并不能直接访问,需要进行端口映射。我们可以启动前先对考虑可能部署的服务做地址映射,但是计划赶不上变化总会存在需要后续增加的情况,这个时候就需要对已启动容器新增端口映射。

1、创建容器的时候指定端口映射

  新建容器的时候添加端口映射比较简单,使用-p host_port:docker_port参数指定映射关系即可,host_port表示主机上监听的端口,docker_port表示容器内部监听的端口。如果主机上启用了防火墙,我们还需要在防火墙上开通策略才可以实现远程访问。

[root@test ~]# docker run -itd -p 2222:22 --name centos7 --restart=always centos:centos7 /usr/sbin/init
5b420aeb7f2f907f3066c178c6c96b276b6f4bda9e0a9e228a9dcd4a4133d32c

容器内部用不了vim命令 容器常用命令_容器ssh服务安装

2、已运行容器添加端口映射

  • 如果是已运行容器添加端口映射就比较麻烦些,停止docker,修改配置,然后重新启动docker服务和容器。需要修改config.v2.json、hostconfig.json配置文件增加端口映射。
  • 容器内部用不了vim命令 容器常用命令_容器内部用不了vim命令_02

  • 对于已运行的容器,我们可能已经忘了容器存储的元数据目录名称(就是这一串哈希),我们可以查看每个哈希值目录下的hostname文件,以此确定对于需要修改的容器。实际上这一串哈希值的前10个字符就是容器的container id。
  • 容器内部用不了vim命令 容器常用命令_增加端口映射_03

  • 停止容器和docker服务,记得修改配置文件前一定要先停止docker服务,否则修改重启docker后会导致配置文件被默认配置覆盖。
(base) [root@test 3e4353876ab3716a1c83a7b62abfab26ef6db89f13254518a5250073f1d3105c]# docker stop centos7
 (base) [root@test 3e4353876ab3716a1c83a7b62abfab26ef6db89f13254518a5250073f1d3105c]# systemctl stop docker
  • 配置文件是json格式,我们可以使用jq清晰查看内容,使用vim命令编辑json文件,编辑配置文件,参照现有格式添加端口映射内容。直接编辑不方便,当然我们也可以下载json文件到本地用工具编辑后上传。
(base) [root@test 3e4353876ab3716a1c83a7b62abfab26ef6db89f13254518a5250073f1d3105c]# jq '.' hostconfig.json 
{
...
  "NetworkMode": "default",
  "PortBindings": {
    "22/tcp": [
      {
        "HostIp": "",
        "HostPort": "2222"
      }
    ]
  },
  ...
 (base) [root@test 3e4353876ab3716a1c83a7b62abfab26ef6db89f13254518a5250073f1d3105c]# jq '.' config.v2.json 
 ...
     "ExposedPorts": {
      "22/tcp": {}
    },
 ...
     "Ports": {
      "22/tcp": [
        {
          "HostIp": "0.0.0.0",
          "HostPort": "2222"
        }
      ]
    },
 ...

容器内部用不了vim命令 容器常用命令_容器ssh服务安装_04

- 验证json文件格式,配置修改完成后使用python -m json.tool工具校验配置是否正确,如果配置有误则会报错,如果格式正确则会输出显示文件内容。

(base) [root@test 3e4353876ab3716a1c83a7b62abfab26ef6db89f13254518a5250073f1d3105c]# python -m json.tool hostconfig.json
  • 验证配置文件无误以后,重新启动docker服务并检查监听端口和映射关系。