扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
2.1 在测试机启动容器,安装ssh
创新互联主营爱辉网站建设的网络公司,主营网站建设方案,App定制开发,爱辉h5成都微信小程序搭建,爱辉网站营销推广欢迎爱辉等地区企业咨询
docker run -i -t ubuntu /bin/bash #此方式运行的容器,退出后容器就会关闭。
apt-get install openssh-server #安装ssh
#需要修改/etc/sshd/sshd_config文件中内容
PermitRootLogin yes
UsePAM no
2.2 启动ssh,容器以后台方式运行
docker run -d -p 50001:22 容器id /usr/sbin/sshd-D
#容器id可通过 docker ps-a查看,最上面的为最新的。
2.3 通过ssh连接到容器安装软件
ssh root@127.0.0.1-p 50001
#连上后想装什么就装什么,可使用exit退出容器,但后台还会运行。
2.4 服务安装完成后,停止容器。
docker stop 容器id #停止运行的容器
2.5 把容器提交生成最新的镜像
docker commit 容器id debian02 #把这个容器提交生成新的debian02镜像(该镜像是原始镜像与容器的整合)
2.6 打包镜像
docker save debian02 /root/debian02.tar #debian02镜像打包
2.7 在另外的机器上导入镜像
docker load debian02.tar #导入镜像
docker images #查看存在的镜像
2.8 启动容器
docker run -h="redis-test" --name redis-test -d -p 51000:22 -p51001:3306 -p 51003:6379 -p 51004:6381 -p 51005:80 -p 51006:8000 -p 51007:8888 debian02 /etc/rc.local
#此处是我测试机器启动命令,指定主机名与端口映射。
#启动后,后面又装了程序,开机自启动命令可放在/etc/rc.local文件中。
docker容器迁移简单方便,可以任意的拷贝部署,以后再也不怕新部署环境了,一堆依赖装的想死有木有。
3、关于docker容器的端口映射
由于docker容器的IP地址每次启动都会变,所以不适用于手动添加端口映射(难道每次重启都来查看容器的IP么?),所以需要每次启动容器时由docker程序自动添加NAT规则,前期尽可能的把需要映射的端口在创建容器时配置好,如下:docker run -h="activemq" --name activemq -d -p 51000:22 -p 51001:3306-p 51003:6379 -p 51004:6381 -p 51005:80-p 51006:8000 -p 51007:8888 debian/base/etc/rc.local
#此处我把mysql,redis,nginx,ssh都进行了映射。
后续对于docker容器的管理,记住容器的名称,如上述名称是activemq,则使用docker stop,start来控制容器进程。docker stop activemq
docker start activemq
当然,也可以不让docker每次启动容器修改容器的IP地址,参考如下:
docker网络配置:
4、关于docker容器的多程序开机自动运行
docker容器每次启动时,开机自启动的命令都要在启动容器前指定。如 docker run -I -t debian /bin/bash命令,只会运行/bin/bash程序,其它的程序都不会运行,对于要跑多个程序的容器特别纠结。
多程序开机自动运行方法:
可把前面所说的启动命令换成dockerrun -I -t debian /etc/rc.local,在容器中把所有需要开机自的启动命令放在/etc/rc.local中,就可以达到多程序开机自启动了。
后台运行则是:docker run -d -p 50001:22 debian /etc/rc.local。注意:run命令是创建一个新的容器,如果要启动一个曾经运行过的容器,则用命令docker ps -a中找对应的容器ID,然后使用docker start 容器ID即可。
步骤1:为我们的容器创建第一个镜像
# 以 centos 镜像作为基础镜像,我们启动自己的容器并在其中执行/bin/bash命令
# 注:-t -i 参数用于创建一个虚拟的命令行。
sudo docker run -t -i centos /bin/bash
现在我们已经成功的运行了自己的第一个容器,并且进入到容器的命令行界面中。在容器中,我们执行下面的命令:
yum -y update # 更新软件包
yum install which # 安装which命令
yum install git # 安装Git
安装完成后,按 Ctrl + d 来退出容器的命令行。
# 执行sudo docker ps -a,可以看到被我们终止的容器
CONTAINER ID IMAGE COMMAND CREATED……
da9031d3568f centos:6.4 /bin/bash 5 minutes ago…..
把我们所做的改变提交到一个新的容器:
# 这里我们创建一个自己的基础容器,容器中安装好了文章中所需的常用工具。读者的容器 id 可能与文章中的有所不同,以上一步 docker ps -a 的结果为准。
sudo docker commit da90 custom/base
容器成功提交后,执行 sudo docker images ,我们会看到刚才提交的容器(如下面的结果所示)。我们就以这个容器为基础容器,再来创建一个新的容器。
REPOSITORY TAG IMAGE ID CREATED
custom/base latest 05b6cecd370b 2 minutes ago
centos 6.4 539c0211cd76 10 months ago
centos latest 539c0211cd76 10 months ago…
步骤2:创建新的容器,并安装 apache
# 以 custom/base 容器为基础,运行一个新的容器。
sudo docker run -t -i custom/base /bin/bash
# 安装 httpd
yum install httpd
步骤3:再次提交新的容器
按 Ctrl + d 来退出容器的命令行,然后执行命令:
# 这个命令会把步骤2中我们安装 httpd 带来的改变提交到新的名为 custom/httpd 的容器镜像中。你的容器 id 可能会和文章中有所不同,以 sudo docker ps -a 命令的结果为准。
sudo docker commit aa6e2fc0b94c custom/httpd
你应该已经发现了,我们创建了一个带有 http 服务器并可以复用的容器镜像。你可以根据这种思想,为自己所需的每个组件都创建一个容器,然后把这些容器复用于开发环境或者生产环境。
步骤7:运行 http 服务器
# -v will Mount a volume from VM to the container which was also shared from host to Vagrant VM.
# -v 参数把主机共享给虚拟机的一个卷挂载到容器中
# -p forward VM port 80 to container port 80; VM port 80 is mapped to host port 8080 in Vagrantfile
# -p 参数把虚拟机的80端口映射到容器的80端口;虚拟机的80端口在 Vagrantfile 中被绑定到主机的8080端口,也就是:主机8080-虚拟机80-容器80
sudo docker run -t -i -p 80:80 -v /vagrant/htdocs:/var/www/html custom/httpd /bin/bash
# 启动 Apache
apachectl -k start
Docker中我们一般会有两种执行命令的方式,一种是直接进入容器的命令行,在终端执行并查看结果,一种是在后台执行,并不会在终端查看结果。
1、进入容器命令行
su root
docker run -i -t ubuntu:16.04/bin/bash#或者执行下面这句docker run -it ubuntu:16.04/bin/bash
-i和-t的作用是帮助你进入交互模式,如果不加这部分,你将无法进入容器内部,更别说使用命令行了。/bin/bash的意思就是使用容器的命令行来输入命令。执行结果如下:
root@7d150a0fb029:/#
root后面跟的就是容器id,表明你已经进入容器,可以输入命令了,你可以输入一些常用命令试试:
root@7d150a0fb029:/# docker run -i -t ubuntu:16.04 /bin/bash
结果输出了镜像的内核版本信息:
Linux version 4.13.0-36-generic (buildd@lgw01-amd64-033)(gcc version 5.4.020160609(Ubuntu5.4.0-6ubuntu1~16.04.9))#40~16.04.1-Ubuntu SMP Fri Feb 16 23:25:58 UTC 2018
通过exit可退出容器。
2、后台执行命令
输入下面的代码,-d表示的就是后台运行,这点可以直接通过docker run –help查看该命令的功能。下面这句话的意思就是在镜像的程序中添加引号内的代码,并在后台运行。
docker run -d ubuntu:16.04 /bin/sh -c "while true; do echo hello world; sleep 1;done"
输出结果不会显示运行的结果,而是给出新建的容器id,这里说明一下,每次输入docker run命令都会新建一个容器,产生一个新的id。
输出结果如下:
c7188be9bd7b5c0aa91c5eeb72013996c89bfdc2181d1a5ff7f880af6f8aff99
查看一下正在运行的容器:
root@cdl-XPS15R:/home/cdl# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7188be9bd7b ubuntu:16.04"/bin/sh -c 'while t…"13 seconds ago Up11 seconds keen_vaughan1b6ba17f7df7 ubuntu:16.04"/bin/bash"2 minutes ago Exited(0)2 minutes ago cocky_noether7d150a0fb029 ubuntu:16.04"/bin/bash"4 minutes ago Exited(0)2 minutes ago hopeful_banach
这里会发现,第一个容器的id和后台运行的容器id前几位一模一样,但是长度要长很多,其实是一样的,只不过通过ps命令打印输出时为了方便显示只显示了前几位。
如果想要进入后台运行的容器的命令行而不创建新的容器,只需要输入以下命令:
#Exec是进入已经存在的容器,run是创建新容器docker Exec-it c7188be9bd7b /bin/bash
输入哪个更长的id也是一样的效果:
docker Exec -it c7188be9bd7b5c0aa91c5eeb72013996c89bfdc2181d1a5ff7f880af6f8aff99 /bin/bash
输出结果都是:
root@c7188be9bd7b:/#
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流