寫到前面
給別人寫的看的柿冲,順便發(fā)出來(lái)衡查,適合沒(méi)用過(guò)快速上手的
有些解釋為了說(shuō)明問(wèn)題用僧,概念并不是很準(zhǔn)確
簡(jiǎn)單了解下概念
-
image
鏡像壶栋,就像安裝系統(tǒng)的.iso鏡像辰如,包含了系統(tǒng)文件/環(huán)境(比如運(yùn)行java的環(huán)境)等 -
container
實(shí)例,運(yùn)行一個(gè)鏡像的實(shí)例贵试,就像是new了這個(gè)鏡像
1. 去安裝
Windows/Mac下直接點(diǎn)擊這里去下載安裝桌面
其他的或者更詳細(xì)的去看這里: Docker 安裝琉兜,側(cè)邊欄有各種系統(tǒng)的安裝
2. 找個(gè)centos7的鏡像試試
centos7是常見(jiàn)的線上服務(wù)器環(huán)境凯正,這里運(yùn)行一個(gè)centos7實(shí)例
2.1 拉取鏡像
默認(rèn)情況下會(huì)去 https://hub.docker.com/ 倉(cāng)庫(kù)下拉取,就跟代碼倉(cāng)庫(kù)呕童、maven倉(cāng)庫(kù)類似漆际,怎么修改倉(cāng)庫(kù)地址可以去百度
拉取鏡像:
docker pull centos:centos7
壓縮后的大小只有72.57 MB,應(yīng)該很快就好了
這時(shí)運(yùn)行docker images
夺饲,可以看到有centos:centos7的鏡像
~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos centos7 7381c3b1d15c 6 weeks ago 204MB
2.2 運(yùn)行一個(gè)容器
運(yùn)行一個(gè)centos7容器奸汇,-it
是進(jìn)入命令交互界面,冒號(hào)前面的centos是REPOSITORY往声,后面的centos7是TAG擂找,憑感覺(jué)理解下
docker run -it centos:centos7 bash
進(jìn)入容器內(nèi)部: 就跟使用一個(gè)linux一樣就行了
執(zhí)行exit
命令退出
3. 自己制作一個(gè)java鏡像
如果沒(méi)有現(xiàn)成的鏡像,如何制作一個(gè)自己需要的環(huán)境浩销,這里以制作java鏡像為例
3.1 編寫Dockerfile
Dockerfile中包含了構(gòu)建鏡像的指令
只要簡(jiǎn)單的先了解三個(gè)指令就行:
-
FROM
依賴的基礎(chǔ)鏡像贯涎,相當(dāng)于直接在依賴的鏡像上操作 -
RUN
要執(zhí)行的命令,先直接使用shell命令就行了慢洋,別的格式后面再去百度 -
ENV
設(shè)置環(huán)境變量
新建一個(gè)文件塘雳,文件名就叫Dockerfile
,也可以叫別的普筹,只不過(guò)使用別的名字構(gòu)建時(shí)需要通過(guò)-f
指定败明,感興趣可以查下
Dockerfile文件內(nèi)容:
# 這里就以上面的centos7為基礎(chǔ)鏡像
FROM centos:centos7
# 更換yum源,如果你訪問(wèn)默認(rèn)源的速度很快太防,也可以注釋掉
RUN echo "更換yum源"
RUN sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
-i.bak \
/etc/yum.repos.d/CentOS-Base.repo
RUN yum makecache
# 這里偷下懶妻顶,直接yum install 很老的java8
RUN echo "安裝java8"
RUN yum install -y java-1.8.0-openjdk*
# 設(shè)置JAVA_HOME,這里的路徑是個(gè)軟鏈
RUN echo "設(shè)置JAVA_HOME"
ENV JAVA_HOME=/etc/alternatives/java_sdk_1.8.0
RUN echo "構(gòu)建完成"
3.2 構(gòu)建鏡像
現(xiàn)在構(gòu)建一個(gè)REPOSITORY為java
, TAG為1.8-centos7
的鏡像
在剛才的Dockerfile
文件所在目錄執(zhí)行命令(注意最后的.
代表構(gòu)建上下文為當(dāng)前目錄):
docker build -t java:1.8-centos7 .
構(gòu)建完成后:3.3 運(yùn)行看看
進(jìn)入java容器:
docker run -it java:1.8-centos7 bash
看看環(huán)境并隨便寫個(gè)HelloWorld運(yùn)行下:
[root@5c82e883b72a /]# echo $JAVA_HOME
/etc/alternatives/java_sdk_1.8.0
[root@5c82e883b72a /]# java -version
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
[root@5c82e883b72a /]# mkdir -pv /opt/app && cd /opt/app
mkdir: created directory '/opt/app'
[root@5c82e883b72a app]# cat >> HelloWorld.java << EOF
> public class HelloWorld {
> public static void main(String[] args) {
> System.out.println("Hello world");
> }
> }
> EOF
[root@5c82e883b72a app]# ls
HelloWorld.java
[root@5c82e883b72a app]# javac HelloWorld.java
[root@5c82e883b72a app]# ls
HelloWorld.class HelloWorld.java
[root@5c82e883b72a app]# java HelloWorld
Hello world
[root@5c82e883b72a app]#
exit
退出下
4. 怎么保存容器內(nèi)文件
上面運(yùn)行exit
退出蜒车,再創(chuàng)建容器讳嘱,發(fā)現(xiàn)剛才/opt下的/app目錄和HelloWorld.java文件不見(jiàn)了
如果想要文件還在,可以通過(guò)-v
選項(xiàng)去掛載容器內(nèi)目錄酿愧,當(dāng)然還有其他掛載方式沥潭,可以去百度
這里給宿主機(jī)當(dāng)前用戶下新建了一個(gè)目錄: ~/demo/mount_opt
掛載這個(gè)目錄到容器中的/opt
運(yùn)行命令,創(chuàng)建一個(gè)掛載了目錄的容器:
docker run -it -v ~/demo/mount_opt:/opt java:1.8-centos7 bash
嘗試容器內(nèi)創(chuàng)建文件后退出容器嬉挡,宿主機(jī)存在創(chuàng)建的文件
再次進(jìn)入叛氨,容器內(nèi)仍然有文件
5. 啟動(dòng)容器直接運(yùn)行自己的程序
這部分需要在宿主機(jī)
操作
5.1 新建HelloWorld.java文件
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
5.2 新建start.sh文件
#!/bin/bash
cd /opt
javac HelloWorld.java
echo "Run HelloWorld >>>>"
java HelloWorld
5.3 修改Dockerfile,把自己的代碼打包進(jìn)鏡像
直接以上面的鏡像java:1.8-centos7
為基礎(chǔ)鏡像棘伴,使用COPY
命令將代碼復(fù)制到鏡像中
# 使用上面的java鏡像
FROM java:1.8-centos7
# 文件復(fù)制到鏡像內(nèi)/opt目錄下,根據(jù)自己目錄決定
COPY HelloWorld.java /opt/
COPY start.sh /opt/
RUN echo "構(gòu)建完成"
注意: 這里HelloWorld.java屁置、start.sh焊夸、Dockerfile文件在同一目錄下,如果不同目錄蓝角,需要修改Dockerfile
5.4 構(gòu)建新鏡像
在Dockerfile文件所在目錄
下執(zhí)行:
docker build -t helloworld:java1.8-centos7 .
構(gòu)建成功后通過(guò)docker images
可以看到
5.5 啟動(dòng)容器運(yùn)行我們的start.sh
docker run -it helloworld:java1.8-centos7 bash /opt/start.sh
可以看到j(luò)ava代碼的輸出
6. 怎么再開(kāi)一個(gè)運(yùn)行的容器終端
比如阱穗,上面運(yùn)行的容器饭冬,終端提示符root@
之后就是容器ID的前8位,也可以通過(guò)docker ps
命令查看容器ID
這里的容器ID是2e67d474993a
直接在別的終端通過(guò)docker exec
命令進(jìn)入就可以了:
docker exec -it 2e67d474993a bash
7. 鏡像保存給別人用
通過(guò)docker save
保存鏡像
這里保存后再壓縮減少大小:
docker save java:1.8-centos7 | gzip > ./java-1.8-centos7.tar.gz
通過(guò)docker load -i java-1.8-centos7.tar.gz
加載即可
當(dāng)然揪阶,還有docker export
和docker import
昌抠,是針對(duì)容器操作的
8. 其他常用操作
-
docker run的各種參數(shù)
參考Docker run 命令,常用的有:-
-d
后臺(tái)運(yùn)行 -
-i
交互模式 -
-t
終端 -
-p
端口映射 -
--rm
容器退出清理容器內(nèi)文件 -
-v
文件掛載 -
--mount
文件掛載
-
docker start/stop/restart
-
docker inspect
查看容器或者鏡像的信息 -
docker cp
容器和宿主機(jī)之間復(fù)制文件 -
docker rmi
刪除鏡像 -
docker rm
刪除容器 -
docker commit
把容器現(xiàn)有狀態(tài)保存為鏡像鲁僚,比如上面就可以在容器里編譯java炊苫,編寫腳本,把容器當(dāng)前狀態(tài)保存為鏡像
9. 常用快捷操作
刪除所有none的鏡像
docker rmi -f $(docker images | grep "none" | awk '{print $3}')
刪除所有容器
docker rm -f $(docker ps -aq)
10. 最后
上面運(yùn)行的容器冰沙,在退出時(shí)都沒(méi)有清理容器的文件系統(tǒng)
運(yùn)行docker ps -a
可以看到退出的容器們
可以:
通過(guò)docker rm 容器ID
刪除
通過(guò)docker rm -f $(docker ps -aq)
刪除所有容器
在docker run
中加上參數(shù)--rm
侨艾,當(dāng)然,現(xiàn)在來(lái)不及了