安裝 docker
使用 yum 安裝
yum install docker
啓動 docker
systemctl start docker.service
設置開機啓動
systemctl enable docker.service
docker 常用指令
使用 run 創建一個 docker 鏡像
# -i 表示 持續交互輸入,-t 則是選擇一個鏡像文件,/bin/bash 則是表示這個容器提供一個shell交互, --name 指定docker容器的名字,這條指令會我們創建一個擁有最基本功能的centos容器,你可以把它當虛擬機使用
docker run --name first_docker -i -t centos /bin/bash
使用 exit 退出 docker 鏡像,由於這是一個交互式docker容器,所以已退出容器就會停止運行
exit
使用 info 查看 docker 信息
docker info
使用 ps 查看 docker 容器信息
# 查看正在運行的 docker 容器信息
docker ps
# 查看所有 docker 容器信息
docker ps -a
使用 start 啓動 docker 容器,stop 停止 docker 容器,restart 重啓 docker 容器,attach 進入 docker 容器
docker ps -a
# 後面接容器的 id 或者 名字
docker start name/id
docker stop name/id
docker restart name/id
docker attach name/id
創建一個守護進程 docker
# -d 表示進程後臺執行,-c 是執行命令,這裏用了while true,所以表示這個守護進程會在後臺一直執行hello world
docker run --name hello_world -d centos /bin/sh -c "while true;do echo hello world; sleep 1; done"
使用 logs 查看 docker容器日誌, –tail number 可以查看最近幾條日誌, -f 監控日誌, -t 顯示時間戳
docker logs hello_world
docker logs --tail 10 hello_world
# 使用 -t 顯示時間戳,-f 實現監控
docker logs --tail 10 -ft hello_world
使用 top 查看容器內部進程
docker top hello_world
使用 exec 在容器內部運行新進程
# 運行後臺任務
docker exec -d first_docker mkdir test
# 進行交互命令, 創建 TTY 捕捉 STDIN
docker exec -t -i hello_world /bin/bash
使用 inspect 查看容器詳細信息
docker inspect hello_world
使用 rm 來刪除容器,刪除之前需要先停止容器的運行
docker rm hello_world
使用 images 列出鏡像
docker images
使用 pull 拉取 倉庫鏡像,鏡像之間使用 tag 來區分
# 拉取 centos 倉庫的所有鏡像
docker pull centos
使用 search 查詢倉庫鏡像
docker search centos
使用 commit 提交鏡像 (不推薦)
# id/name 是容器,repository是倉庫,tag是標籤
docker commit id/name repository:tag
使用 rmi 刪除鏡像
# image_name 是鏡像名
docker rmi image_name
使用 dockerfile 構建文件 和 build 指令創建鏡像 (推薦,便於調試錯誤)
# 構建文件詳解,注意所有的構建指令必須大寫,如FROM,RUN
# 使用#來進行註解
#Version: 0.0.1
# From 表示使用什麼鏡像進行基礎構建
From centos
# MAINTAINER 表示作者的基本信息
MAINTAINER Yiyang Zeng "[email protected]"
# Run 表示針對基本的鏡像在執行指令進行拓展,比如這裏就是導入的兩個包,可以使用wget指令
Run yum -y install iproute
Run yum -y install wget
# 開發的端口
EXPOSE 80
# -f 是構建文件的路徑,-t 是鏡像文件的倉庫以及標籤信息,不要忘記最後還有一個小點
docker build -f ./my_centos -t zyy/centos:first .
使用 history 查看鏡像的創建過程
# image_id 是鏡像的ID
docker history image_id
在 run 指令中使用 -p 來綁定端口
# 宿主機的 9527 綁定 容器的80,不指定宿主機,則會在 49153-65535 之間進行隨機選擇
docker run --name first_build -p 9527:80 -t -i e2906ce60fb1 /bin/bash
使用 port 查看容器端口情況
docker port first_build
使用 push 將鏡像上傳到 docker hub
# zyy2404 是 docker hub 的用戶名,沒有要求註冊
docker push zyy2404/centos:first
問題:推送過程可能會不成功即出現下面這種情況getsocket:connection refused.
vi /etc/docker/daemon.json
# 根據registry的ip地址
增加"insecure-registries": ["192.168.56.101:5000"]
查看倉庫擁有的鏡像
使用 瀏覽器訪問 http://:5000/v2/_catalog
DockerFile指令
使用 CMD 來指定容器啓動時的指令,和 RUN 的區別在於一個是啓動,一個是構建
# 執行 start,run 指令時會進入shell交互,
CMD ["/bin/bash"]
# 執行 CMD 中的 /bin/bash 進入命令行
docker run --name second_docker -t -i centos
# CMD 和 run指定的命令互斥,此時不會執行CMD的命令,所以只會執行 /bin/ps
docker run --name second_docker -t -i centos /bin/ps
使用 ENTRYPOINT 來指定啓動時指令,和 CMD 不同的是,它不會被 run 覆蓋,除非 run 使用了 --entrypoint
# 例子: 使用 java -jar 啓動一個 java 工程,注意這種路徑不是容器中的路徑,只是爲了代表一個絕對路徑
ENTRYPOINT["/home/zyy/app/jdk1.8.0_144/bin/java","-jar","/home/zyy/app/CALS.jar"]
# 可以和run結合使用
ENTRYPOINT["/home/zyy/app/jdk1.8.0_144/bin/java"]
docker run --name first_java -t -i cals -jar /home/zyy/app/CALS.jar
# 可以和 CMD 結合使用
ENTRYPOINT["/home/zyy/app/jdk1.8.0_144/bin/java"]
CMD["-jar","/home/zyy/app/CALS.jar"]
使用 WORKDIR 設置工作目錄
# 設置當前工作目錄,相當於 cd
WORKDIR /var/log
# run 也可以達到同樣的效果
docker run --name first_java -t -i cals -w /var/log pwd
使用 ENV 設置環境變量
# 比如設置 jdk 的環境變量
ENV JAVA_HOME /home/zyy/app/jdk1.8.0_144/bin/java
# 在構建過程中,往後可以使用這個環境變量
ENTRYPOINT[$JAVA_HOME]
使用 USER 指定用戶
USER zyy
USER user:group
# docker run 也可以指定
run -u zyy
使用 VOLUMN 來向基於鏡像創建的容器添加捲
# 可以添加多個卷
VOLUMN["/opt/project","/data"]
使用 ADD 從構造環境目錄複製文件到容器中
# 如果文件是歸檔文件,還會進行解壓
ADD test_add.txt /home/zyy
使用 COPY 也可以複製,不同在於不會進行解壓和提取
COPY test_add.txt /home/zyy
使用 ONBUILD 來設置觸發器,也就是當它被用作基礎鏡像時,在 FROM 之後會執行觸發器的命令
ONBUILD RUN yum -y install wget
ONBUILD JAVA_HOME /home/zyy/app/jdk1.8.0_144/bin/java
創建 Docker Registry
可以直接使用docker提供的開源鏡像 registry
docker run -p 5000:5000 registry
更改 tag
docker tag 7b645f38ac65 ip:5000/zyy2404/centos:first
push 到 registry
docker push ip:5000/zyy2404/centos:first
dockerfile 實例
使用 dockerfile 生成 redis 容器
#Version: 0.0.1
FROM centos
MAINTAINER Yiyang Zeng "[email protected]"
#RUN yum -y update
RUN mkdir redis
WORKDIR /redis
RUN yum -y install wget gcc make
# 注意這裏需要在dockerfile 目錄放置要複製的配置文件
ADD redis.conf /redis/redis.conf
RUN wget http://download.redis.io/releases/redis-5.0.3.tar.gz
RUN tar -axvf redis-5.0.3.tar.gz
WORKDIR /redis/redis-5.0.3
RUN make && make install
EXPOSE 6379
ENTRYPOINT ["/usr/local/bin/redis-server"]
docker run --name first_redis -p 5555:6379 878c9ac5369f /redis/redis.conf
使用 dockerfile 生成 python 容器
#Version: 0.0.1
FROM centos
MAINTAINER Yiyang Zeng "[email protected]"
RUN mkdir python
WORKDIR /python
RUN yum -y update
RUN yum -y install wget
RUN wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz
RUN tar -axvf Python-3.6.0.tgz
RUN yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel make gcc-c++ gcc
WORKDIR /python/Python-3.6.0
RUN ./configure --prefix=/usr/local && make -j 4 && make install
EXPOSE 22
docker run --name first_python -p 7777:22 -t -i 01f219235679 /bin/bash