一、Docker是什么?
產生背景:
- 開發和運維之間因為環境不同和導致的矛盾(不同的操作系統、軟件環境、應用配置等)DevOps
- 代碼、系統、環境、配置等封裝成鏡像Image--->運維;
- 集群的環境下每台服務器都要配置相同的環境;
- 解決“在我的機器是哪個可以正常工作”的問題;
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。
阿里雲、百度雲等都支持Docker技術
二、Docker的作用
1.Docker是一種容器技術:
- 將軟件環境安裝並且配置好,打包成一個鏡像Image,然后將鏡像發布出去(Docker倉庫)
- 其他的使用者可以在倉庫中下載獲取這個鏡像;
- 通過Docker運行這個鏡像,就可以獲取通用的環境(容器);
Docker簡化了環境的部署和配置,實現一個構建,處處運行,避免了因為運行環境的不一致而導致的異常;
2.Docker容器技術與傳統的虛擬技術的區別:
- 傳統虛擬技術:模擬一個完整的操作系統,先虛擬出一套硬件,然后在其上安裝操作系統,最后在系統上運行應用程序;
- Docker容器技術:不是模擬一個完整的操作系統,沒有進行硬件的虛擬,而是對進程進行隔離,封裝成容器,容器內的應用程序是直接使用宿主機的內核,且容器之間是相互隔離的,互不影響;優點:更輕便、效率高、啟動快、秒級;
3.基本術語:
- Docker主機(Host)安裝了Docker程序的主機,運行Docker守護進程;
- Docker鏡像(Image)將軟件環境打包好的模板,用來創建容器的,一個鏡像可以創建多個容器;
- Docker容器(Container)運行鏡像后生成的實例稱為容器,沒運行一次鏡像就會產生一個容器,容器可以啟動、停止或刪除容器使用的是沙箱機制,相互隔離,是獨立是安全的;可以把容器看作是一個簡易版的Linux環境,包括用戶權限、文件系統和運行的應用等;
- Docker倉庫(Repository)用來保存鏡像的,倉庫中包含許多鏡像,每個鏡像都有不同的標簽Tag;
官方倉庫:https://hub.docker.com/
4.使用Docker的步驟:
①.安裝Docker
②.從Docker倉庫中下載軟件對應的鏡像;
③.運行這個鏡像,此時會生成一個Docker容器;
④.對容器的啟動/停止就是對軟件的啟動/停止;
三、准備Linux系統:
1.安裝虛擬機軟件
VMware、VirtualBox
Ubuntu、RHEL、CentOS、Debian、SLES(SUSE)
2.新建虛擬機:
版本:Red Hat(64bit) 網絡:橋接網卡 光驅:選擇操作系統的iso文件
3.安裝CentOS(我個人喜歡裝CentOS)
4.連接Linux服務器:
步驟: 1. 查看服務器ip地址、在虛擬機中執行 ip addr 2. 連接服務器 在客戶端中執行 ssh 服務器賬戶@服務器地址 ,然后輸入密碼 注:SSH是Secure Shell的縮寫,用於遠程登陸訪問的協議
5.基本操作
5.1常用命令:
cat /proc/cpuinfo # 查看cpu信息 cat /proc/meminfo # 查看內存信息 uname -r # 查看內核信息,Docker要求CentOS必須是64位,且內核是3.10及以上 sudo reboot # 重啟,sudo表示以管理員root身份執行 sudo halt # 關
5.2安裝軟件:
使用yum,是一個基於rpm的軟件包管理工具;
用來安裝軟件包,可以自動解決軟件包之間的依賴關;
yum install 軟件包名 # 安裝
yum remove 軟件包名 # 卸載
四、Docker安裝:
1.安裝:
Docker版本:社區版CE、企業版EE;
# 設置yum源 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add--repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast # 安裝Docker-CE
yum -y install docker-ce
2.啟動/停止
docker version # 查看版本
systemctl start docker # 啟動
systemctl stop docker # 停止
systemctl status docker # 查看狀態
systemctl restart docker # 重啟
systemctl enable docker # 設置開機自動啟動
# 驗證,運行helloworld
docker run hello-world # 下載helloworld鏡像並運行
3.配置Docker鏡像加速
使用阿里雲提供的鏡像加速(鏡像倉庫),也可以使用網易雲等;
步驟:
①.注冊並登陸“阿里雲的開發者平台”http://dev.aliyun.com;
②.查看專屬的加速器地址;
③.配置自己的Docker加速器;
vi /etc/docker/daemon.json {
"registrymirrors": ["https://sswv6yx0.mirror.aliyuncs.com"] } systemctl daemon-reload systemctl restart docker
五.Docker操作:
輸入docker可以查看Docker的命令用法,輸入docker COMMAND --help查看指定命令的詳細用法;
1.鏡像操作:
操作 | 命令 | 說明 |
查找 | docker search關鍵字 | 可以在Docker Hub網站查看鏡像的詳細信息,如鏡像的tag標簽 |
抽取 | docker pull 鏡像名:tab | :tag表示軟件的版本,如果不指定默認是latest |
列表 | docker images | 查看所有本地鏡像 |
獲取元信息 | docker inspect 鏡像id | 獲取鏡像的元信息,詳細信息 |
刪除 | docker mi -f 鏡像id或鏡像名:tag | 刪除指定的本地鏡像,f表示強制刪除 |
2.容器操作:
操作 | 命令 | 說明 |
運行 | docker run name 容器名 i t p 主機端口:容器端口 d v 主機目錄:容器目錄:ro 鏡 像id或鏡像名稱:tag |
name 指定容器名,名稱自定義,如果不指定會自動命名; i 以交互模式運 行,即以交互模式運行容器;t 分配一個偽終端,即命令行,通常組合使用it ;p 指定端口映射,將主機端口映射到容器內的端口;d 表示后台運行,即守 護式運行容器;v 指定掛載主機目錄到容器目錄,默認為rw讀寫模式,ro表示 只讀 |
列表 | docker ps a q | 查看正在運行的容器,a表示顯示所有容器,q表示只顯示容器id |
啟動 | docker start 容器id或容器名 稱 | 啟動容器 |
停止 | docker stop 容器id或容器名 稱 |
停止正在運行的容器 |
刪除 | docker rm f 容器id或容器名 稱 |
刪除容器,-f表示強制刪除 |
日志 | docker logs 容器id或容器名 | 獲取容器的日志 |
在容器中執行 | docker exec it 容器id或容 器名稱 /bin/bash |
進入正在運行的容器中並開啟一個交互模式的終端,可以在容器中執行操作 |
拷貝文件 | docker cp 主機中的文件路徑 容器id或容器名稱:容器中的文件路徑 主機路徑 | 將文件中的文件拷貝到容器中;將容器中的文件拷貝到主機中 |
獲取元信息 | docker inspect 容器id | 獲取容器的元信息 |
以CentOS為例:
docker search centos docker pull centos docker run --name mycentos -it centos:latest # 根據centos:latest鏡像運行容器,並以交互模式 進入容器中 # 實際上是在Docker容器中運行一個精簡版的CentOS系統 exit # 退出並關閉容器 docker ps -a docker start mycentos docker stop mycentos docker rm mycentos docker rm -f $(docker ps aq) # 強制刪除所有容器
注釋:Docker容器內實際上是運行着一個精簡版的Linux系統
以tomcat為例:
# 示例1:基本用法 docker search tomcat docker pull tomcat docker run --name mytomcat -p 8888:8080 -d tomcat # 測試:http://宿主機地址:8888 docker stop mytomcat docker ps -a docker start mytomcat # 示例2:拷貝文件和掛載目錄 docker run -p 8080:8080 -d tomcat docker exec -it 70cba924861c /bin/bash cd /usr/local/tomcat/webapps/ROOT exit echo welcome to tomcat > index.jsp docker cp index.jsp 70cba924861c:/usr/local/tomcat/webapps/ROOT # 將宿主機中的文件拷貝到 容器中指定的目錄中 # 部署web項目,將war文件放到容器中 docker cp spring-web.war 70cba924861c:/usr/local/tomcat/webapps # 問題:如果項目更改了需要重新拷貝war文件,太麻煩,可以直接掛載目錄(也稱為數據卷Volume) docker run \ -p 8080:8080 \ -v /my/tomcat/webapps/springweb.war:/usr/local/tomcat/webapps/springweb.war\ -v /my/tomcat/data:/usr/local/tomcat/dataVolume:ro \ -d tomcat # 示例3:啟動多個容器,一個鏡像可以啟動多個容器,互相隔離、獨立
docker run -p 8081:8080 -d tomcat docker run -p 8082:8080 -d tomcat docker run -p 8083:8080 -d tomcat
3. 鏡像的分層結構
tomcat鏡像為什么這么大?
鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基於運行環境的軟件,包含運行某個 軟件所需要的所有內容。
基於UnionFS聯合文件系統,采用分層結構,一層一層的堆疊起來,像一個同心圓,但從外面來說,只能看到 最外層的文件系統(鏡像層)
分層結構:共享資源、便於復用(許多鏡像都是從相同的Base基礎鏡像構建而來的,基礎鏡像只需要保存一份)
鏡像都是只讀的,而由鏡像生成的容器是可修改的
4.創建鏡像
有時Docker鏡像倉庫中下載的鏡像不能滿足我們的要求,此時可以基於這個鏡像(基礎鏡像)封裝一個自己的鏡像
兩種方式:
-
-
- 更新鏡像:使用docker commit命令
- 構建鏡像:使用docker build命令,需創建Dockerfile文件
-
4.1.更新鏡像:
先使用基礎鏡像創建一個容器,然后對容器進行修改,最后使用commit命令提交為一個新的鏡像
步驟:
①.根據基礎鏡像,創建容器;
docker run --name mytomcat -p 8080:8080 -d tomcat
②.修改容器:
docker exec -it bcd08edac78d /bin/bash cd webapps/ROOT rm -f index.jsp echo welcome to tomcat > index.html exit
③.提交為新鏡像,語法:docker commit -m="描述信息" -a="作者" 容器id或容器名 鏡像名:tag
docker commit m="修改默認索引頁" a="小明" bcd08edac78d test/tomcat:v1
④.使用新鏡像運行容器:
docker run name tomcat_v1 p:8080:8080 d test/tomcat:v1
4.2構建鏡像:
根據Dockerfile文件來自動構建鏡像
Dockerfile是一個包含創建鏡像所有命令的文本文件,使用docker build命令可以根據Dockerfile的內容創建鏡像
步驟:
①.創建一個Dockerfile文件vi Dockerfile
# 基礎鏡像 FROM tomcat # 作者
MAINTAINER 郵箱地址填寫 # 執行命令 RUN rm -f /usr/local/tomcat/webapps/ROOT/index.jsp
RUN echo "welcome to tomcat!" > /usr/local/tomcat/webapps/ROOT/index.html
②.構建新鏡像,語法:docker build -f Dockerfile文件的路徑 -t 鏡像名:tag 命令執行的上下文
docker build -f Dockerfile -t test/tomcat:v2
③.使用新建鏡像運行容器
docker run -p 9999:8080 -d test/tomcat:v2
六、Dockerfile詳解
1.簡介:
Dockerfile是用來構建Docker鏡像的文件,是由一系列命令和參數構成的腳本
Dockerfile從FROM命令開始,緊接着各種命令、參數等,最終會生成一個新的鏡像
使用Dockerfile構建鏡像的步驟:
①.編寫Dockerfile文件
②.使用docker build構建鏡像
③.使用docker run運行容器
2.用法:
2.1語法規則:
-
-
- 指令必須要大寫,且后面必須跟參數;
- 第一條指令必須是FROM,指定Base Image基礎鏡像
- 指定按從上往下的順序,依次執行
- 每條指定都會創建一個新的鏡像層並提交
- #表注釋
-
2.2常用指令:
指令 | 解釋 |
FROM | 指定基礎鏡像,即當前鏡像是基於那個鏡像的 |
MAINTAINER | 指定作者 |
RUN | 指定構建過程中需要運行的命令 |
ENV | 設置環境變量 |
WORKDIR | 指定默認的工作目錄,即進入容器后默認進入的目錄 |
VOLUME | 創建掛載點,也稱容器數據卷,用於數據共享和持久化 |
CMD | 指定容器啟動時要運行的命令,與RUN不同的是,這些命令不是在鏡像構建過程中執行的 |
ENTRYPOINT | 指定容器啟動時要運行的命令,與CMD有區別 |
COPY | 拷貝文件/目錄到鏡像中 |
ADD | 拷貝文件到鏡像中,且會自動解壓縮 |
EXPOSE | 指定對外暴露的端口 |
3.按列
3.1自定義centos鏡像
# 1.編寫Dockerfile文件 vi Dockerfile2 FROM centos MAINTAINER 郵箱地址填寫 ENV MYPATH /usr/local/centos RUN mkdir -p $MYPATH WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install wget # 創建掛載點,無法指定宿主機上對應的目錄,是自動生成的
VOLUME ["/data1","/data2"] CMD ["/bin/bash"]
# 2.使用docker build構建鏡像 docker build -f Dockerfile2 -t test/centos:v1 . # 3.使用docker run運行容器 docker run -it b25b1dad795c # 查看鏡像的變更歷史 docker history b25b1dad795c # 驗證掛載點:
/var/lib/docker/volumes/0b001b4cc8db1ebbbb4c537c17a5c44adb700fb0e1b941bc82cc717c4ae196f 6/_data
/var/lib/docker/volumes/f020f5a5664bf68312be9f49a640f27ecfb49990b231aaf3d0eb7cb723fa0dd d/_data
CMD和ENTRYPOINT的區別(面試題):
- CMD
在Dockerfile中可以有多個CMD指令,但只有最后一條指令生效,所以一般只有一條CMD指令 CMD指令在被docker run之后的參數覆蓋
vi aaa
FROM centos
CMD ["/bin/ls"]
CMD ["/bin/bash"]
docker build -f aaa -t test/aaa .
docker run -it test/aaa
docker run -it test/aaa /bin/pwd
- ENTRYPOINT
docker run之后的參數會被作為ENTRYPOINT指令的參數,組合形成新的命令
vi bbb
FROM centos
ENTRYPOINT ["/bin/ls","/usr/local"]
docker build -f bbb -t test/bbb .
docker run -it test/bbb
docker run -it test/bbb -l # ls /usr/local -l
3.2自定義tomcat鏡像:
#准備工作
#1.編寫Dockerfile文件
vi Dockerfile
FROM centos
MAINTAINER 郵箱地址填寫
#拷貝文件,文件必須與Dockerfile在同一目錄下
COPY teacher.txt /usr/local
ADD jdk-8u171-linux-x64.tar.gz /usr/local
ADD apache-tomcat-8.5.30.tar.gz /usr/local
# 配置環境變量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH .:$JAVA_HOME/lib
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.30
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
WORKDIR $CATALINA_HOME
RUN yum -y install vim
EXPOSE 8080
CMD ["catalina.sh", "run"]
# 2.使用docker build構建鏡像
docker build -t test/tomcat:1.0 .
# 3.使用docker run運行容器
docker run \
--name mytomcat \
-p 8080:8080 \
-v /my/tomcat/webapps/springweb.war:/usr/local/apache-tomcat8.5.30/webapps/spring-web.war \
-d itany/tomcat:1.0
七、使用Docker搭建環境
1.安裝MySQL
# 1.拉取鏡像 docker pull mysql:5.7 # 2.運行容器 docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 docker exec -it mysql /bin/bash find / -name "*mysql*" exit
# 3.創建用於掛載的目錄 mkdir -p /my/mysql/conf # 掛載配置文件 mkdir -p /my/mysql/data # 掛載數據文件 mkdir -p /my/mysql/logs # 掛載日志文件
# 4.拷貝配置文件並修改
docker cp mysql:/etc/mysql/mysql.conf.d/mysqld.cnf /my/mysql/conf/
vi /my/mysql/conf/mysqld.conf
character-set-server=utf8
# 5.重新運行容器 docker rm -f mysql # 刪除原來的容器 docker run \
--name mysql \ -p 3306:3306 \ -v /my/mysql/conf:/etc/mysql/mysql.conf.d/ \ v /my/mysql/data:/var/lib/mysql \ -v /my/mysql/logs:/logs \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7 # 6.訪問 # 本地訪問 docker exec -it mysql /bin/bash mysql -u root -p # 遠程訪問 mysql -u root -p -h 宿主機地址
2.安裝Redis
# 1.拉取鏡像 docker pull redis # 2.創建用於掛載的目錄 mkdir -p /my/redis/conf mkdir -p /my/redis/data # 3.拷貝配置文件並修改 wget http://download.redis.io/releases/redis-4.0.10.tar.gz
tar zxf redis-4.0.10.tar.gz cp redis.conf /my/redis/conf/ vi redis.conf
requirepass test
appendonly yes # 4.運行容器 docker run \ --name myredis \ -p 6379:6379 \
-v /my/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /my/redis/data:/data \ -d redis redisserver /usr/local/etc/redis/redis.conf # 5.訪問
# 本地訪問 docker exec -it myredis /bin/bash redis-cli # 遠程訪問 使用RedisDesktopManager工具連接
3.安裝Nginx
# 1.拉取鏡像 docker pull nginx # 2.運行容器 docker run --name mynginx -p 80:80 -d nginx # 3.創建用於掛載的目錄 mkdir -p /my/nginx # 掛載nginx所有數據 mkdir -p /my/nginx/html # 掛載nginx虛擬主機(網站html數據) # 4.拷貝配置文件 docker cp mynginx:/etc/nginx/nginx.conf /my/nginx # 拷貝主配置文件
docker cp mynginx:/etc/nginx/conf.d /my/nginx # 拷貝虛擬主機配置文件
echo welcome to nginx > /my/nginx/html/index.html # 自定義索引頁
# 5.重啟運行容器 docker rm -f mynginx docker run \ --name mynginx \ -p 80:80 -p 443:443 \ -v /my/nginx/nginx.conf:/etc/nginx/nginx.conf \ -v /my/nginx/html:/usr/share/nginx/html:ro \ -v /etc/nginx/conf.d:/usr/nginx/conf.d \ -d nginx # 6.測試 http://宿主機地址
八、將本地鏡像發布到阿里雲
步驟:
1.登陸“阿里雲-開發者平台”,創建命名空間和鏡像倉庫
2.將鏡像推送到阿里雲
# 登陸阿里雲的docker倉庫 docker login --username=注冊的阿里雲的賬號 registry.cn-hangzhou.aliyuncs.com
# 創建指定鏡像的tag,歸入某個倉庫
docker tag b25b1dad795c registry.cn-hangzhou.aliyuncs.com/itany/centos:v1.0
# 將鏡像推送到倉庫中
docker push registry.cn-hangzhou.aliyuncs.com/itany/centos:v1.0
3.拉取鏡像
docker pull registry.cn-hangzhou.aliyuncs.com/itany/centos:v1.0
以上為我學習docker的時候做的的一些總結,有整理的不對的地方還希望可以評論指正!