天天看点

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

作者:码上咖啡馆

一.已经下载好了docker镜像,如何利用这个镜像创建一个容器?

二.创建容器成功后,里面有一些服务是通过提供的端口号和外部进行通信的,但是有一个问题是容器内部的端口号是不能直接和外部客户端如xshell进行通信的,而是需要将容器里面服务的端口号映射到宿主机(物理机)上,外部客户端如xshell和宿主机上的这个端口进行通信

现在使用ubuntu镜像创建一个容器,并且在容器里使用ssh服务和外部进行通信为例子进行讲解。

具体做法:

管理员账号进入系统,使用docker ps查看目前正在运行的容器有哪些以及这些容器是使用什么镜像创建的

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

docker ps查看正在运行的容器信息

可以看到里面有很多正在运行的容器及对应的信息,看最后一个容器hansifan,其使用的镜像是ubuntu:18.04-full,那么,我们现在使用这个镜像再创建一个名为hsftrial的容器,但是这一步要注意,端口映射是在创建容器这一步完成的,所以我们要首先知道这个容器里将要提供什么服务,以及这个服务的默认端口号是多少,并且在创建容器的时候做好端口映射,我们这里就在容器里提供ssh服务,ssh服务的默认端口号是22,我们这里将它和宿主机做端口映射的时候将它映射为20001,使用命令docker run -it -p 想要映射到宿主机上的端口号:容器内部服务的端口号 --name hsftrial 镜像名称 /bin/bash进行操作。

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

创建容器并完成端口映射

这个时候回车,不显示任何信息,操作完成。要注意的是,这条命令中的/bin/bash的作用是创建完容器后自动进入该容器,所以可以看到上述创建完成后自动进入了该容器。

此时,搭建ssh服务

具体两条命令

apt update

apt install -y openssh-server

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

apt update

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

apt install -y openssh-server

再启动容器里的ssh服务,为了方便,可以再使用管理员账号用xshell连接一次服务器,进入后用docker ps查看正在运行的容器

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

再次查看正在运行的容器

可以发现刚刚创建并下载安装了ssh的容器hsftrial正在运行,此时用docker exec -it 容器名/容器ID bash进入这个容器,并用service ssh status查看容器中的ssh服务是否已经启动,若没有启动则使用service ssh start进行启动

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

进入容器启动ssh服务

此时发现容器里的ssh服务已经启动。

再切出来,用docker ps发现hsftrial停止了,那么使用docker start 容器名启动容器

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

启动容器

此时可以发现,容器启动,ssh服务也搭建好了,并且端口映射也做好了(容器里的ssh服务端口映射到宿主机20001端口供外部访问),最后,再给容器设置个密码

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

给容器设置密码

此时,一切都设置好了,那么,是否就可以用xshell进行连接了呢?

在连接前可以在容器中使用whoami确定用户名以便于待会儿登录

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

确当用户名

可知用户名是root

进行登录

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

进行登录

发现登录失败

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

登录失败

这是因为还要对/etc/ssh/sshd_config进行修改配置文件才能通过密码登录,具体修改如下

找到这两行,如果注释就放开注释并将其改为yes

PasswordAuthentication yes

PermitRootLogin yes

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

用vim打开配置文件(没有vim先apt install vim安装vim)

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

修改配置文件

为了让ssh配置文件生效要用service ssh restart进行重载

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

修改配置文件后重载生效

此时再尝试登录

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

进入系统

成功进入系统!!

注:要点是在进行端口映射的时候要预先知道将要提供的服务的默认端口才能在创建容器的时候做好端口映射。

最后,不想要了的容器可以先停止它,再删除它

docker stop 容器名字

docker rm 容器名字

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

正在运行的容器

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

docker stop hsftrial docker rm hsftrial之后的情况

注:docker ps -a可以查看所有容器包括存在但是不正在运行的容器

如何利用docker镜像创建一个容器并为容器中的服务进行端口映射?

查看所有容器

可以发现刚刚的容器确实删除了!