2.1 在測試機啟動容器,安裝ssh
創(chuàng)新互聯(lián)主營愛輝網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,App定制開發(fā),愛輝h5成都微信小程序搭建,愛輝網(wǎng)站營銷推廣歡迎愛輝等地區(qū)企業(yè)咨詢
docker run -i -t ubuntu /bin/bash #此方式運行的容器,退出后容器就會關(guān)閉。
apt-get install openssh-server #安裝ssh
#需要修改/etc/sshd/sshd_config文件中內(nèi)容
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容器遷移簡單方便,可以任意的拷貝部署,以后再也不怕新部署環(huán)境了,一堆依賴裝的想死有木有。
3、關(guān)于docker容器的端口映射
由于docker容器的IP地址每次啟動都會變,所以不適用于手動添加端口映射(難道每次重啟都來查看容器的IP么?),所以需要每次啟動容器時由docker程序自動添加NAT規(guī)則,前期盡可能的把需要映射的端口在創(chuàng)建容器時配置好,如下: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都進行了映射。
后續(xù)對于docker容器的管理,記住容器的名稱,如上述名稱是activemq,則使用docker stop,start來控制容器進程。docker stop activemq
docker start activemq
當然,也可以不讓docker每次啟動容器修改容器的IP地址,參考如下:
docker網(wǎng)絡配置:
4、關(guān)于docker容器的多程序開機自動運行
docker容器每次啟動時,開機自啟動的命令都要在啟動容器前指定。如 docker run -I -t debian /bin/bash命令,只會運行/bin/bash程序,其它的程序都不會運行,對于要跑多個程序的容器特別糾結(jié)。
多程序開機自動運行方法:
可把前面所說的啟動命令換成dockerrun -I -t debian /etc/rc.local,在容器中把所有需要開機自的啟動命令放在/etc/rc.local中,就可以達到多程序開機自啟動了。
后臺運行則是:docker run -d -p 50001:22 debian /etc/rc.local。注意:run命令是創(chuàng)建一個新的容器,如果要啟動一個曾經(jīng)運行過的容器,則用命令docker ps -a中找對應的容器ID,然后使用docker start 容器ID即可。
步驟1:為我們的容器創(chuàng)建第一個鏡像
# 以 centos 鏡像作為基礎鏡像,我們啟動自己的容器并在其中執(zhí)行/bin/bash命令
# 注:-t -i 參數(shù)用于創(chuàng)建一個虛擬的命令行。
sudo docker run -t -i centos /bin/bash
現(xiàn)在我們已經(jīng)成功的運行了自己的第一個容器,并且進入到容器的命令行界面中。在容器中,我們執(zhí)行下面的命令:
yum -y update # 更新軟件包
yum install which # 安裝which命令
yum install git # 安裝Git
安裝完成后,按 Ctrl + d 來退出容器的命令行。
# 執(zhí)行sudo docker ps -a,可以看到被我們終止的容器
CONTAINER ID IMAGE COMMAND CREATED……
da9031d3568f centos:6.4 /bin/bash 5 minutes ago…..
把我們所做的改變提交到一個新的容器:
# 這里我們創(chuàng)建一個自己的基礎容器,容器中安裝好了文章中所需的常用工具。讀者的容器 id 可能與文章中的有所不同,以上一步 docker ps -a 的結(jié)果為準。
sudo docker commit da90 custom/base
容器成功提交后,執(zhí)行 sudo docker images ,我們會看到剛才提交的容器(如下面的結(jié)果所示)。我們就以這個容器為基礎容器,再來創(chuàng)建一個新的容器。
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:創(chuàng)建新的容器,并安裝 apache
# 以 custom/base 容器為基礎,運行一個新的容器。
sudo docker run -t -i custom/base /bin/bash
# 安裝 httpd
yum install httpd
步驟3:再次提交新的容器
按 Ctrl + d 來退出容器的命令行,然后執(zhí)行命令:
# 這個命令會把步驟2中我們安裝 httpd 帶來的改變提交到新的名為 custom/httpd 的容器鏡像中。你的容器 id 可能會和文章中有所不同,以 sudo docker ps -a 命令的結(jié)果為準。
sudo docker commit aa6e2fc0b94c custom/httpd
你應該已經(jīng)發(fā)現(xiàn)了,我們創(chuàng)建了一個帶有 http 服務器并可以復用的容器鏡像。你可以根據(jù)這種思想,為自己所需的每個組件都創(chuàng)建一個容器,然后把這些容器復用于開發(fā)環(huán)境或者生產(chǎn)環(huán)境。
步驟7:運行 http 服務器
# -v will Mount a volume from VM to the container which was also shared from host to Vagrant VM.
# -v 參數(shù)把主機共享給虛擬機的一個卷掛載到容器中
# -p forward VM port 80 to container port 80; VM port 80 is mapped to host port 8080 in Vagrantfile
# -p 參數(shù)把虛擬機的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中我們一般會有兩種執(zhí)行命令的方式,一種是直接進入容器的命令行,在終端執(zhí)行并查看結(jié)果,一種是在后臺執(zhí)行,并不會在終端查看結(jié)果。
1、進入容器命令行
su root
docker run -i -t ubuntu:16.04/bin/bash#或者執(zhí)行下面這句docker run -it ubuntu:16.04/bin/bash
-i和-t的作用是幫助你進入交互模式,如果不加這部分,你將無法進入容器內(nèi)部,更別說使用命令行了。/bin/bash的意思就是使用容器的命令行來輸入命令。執(zhí)行結(jié)果如下:
root@7d150a0fb029:/#
root后面跟的就是容器id,表明你已經(jīng)進入容器,可以輸入命令了,你可以輸入一些常用命令試試:
root@7d150a0fb029:/# docker run -i -t ubuntu:16.04 /bin/bash
結(jié)果輸出了鏡像的內(nèi)核版本信息:
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、后臺執(zhí)行命令
輸入下面的代碼,-d表示的就是后臺運行,這點可以直接通過docker run –help查看該命令的功能。下面這句話的意思就是在鏡像的程序中添加引號內(nèi)的代碼,并在后臺運行。
docker run -d ubuntu:16.04 /bin/sh -c "while true; do echo hello world; sleep 1;done"
輸出結(jié)果不會顯示運行的結(jié)果,而是給出新建的容器id,這里說明一下,每次輸入docker run命令都會新建一個容器,產(chǎn)生一個新的id。
輸出結(jié)果如下:
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
這里會發(fā)現(xiàn),第一個容器的id和后臺運行的容器id前幾位一模一樣,但是長度要長很多,其實是一樣的,只不過通過ps命令打印輸出時為了方便顯示只顯示了前幾位。
如果想要進入后臺運行的容器的命令行而不創(chuàng)建新的容器,只需要輸入以下命令:
#Exec是進入已經(jīng)存在的容器,run是創(chuàng)建新容器docker Exec-it c7188be9bd7b /bin/bash
輸入哪個更長的id也是一樣的效果:
docker Exec -it c7188be9bd7b5c0aa91c5eeb72013996c89bfdc2181d1a5ff7f880af6f8aff99 /bin/bash
輸出結(jié)果都是:
root@c7188be9bd7b:/#