Docker容器雲學習(基本使用)

1.看完docker容器基本架構和基本知識(一定要看官網英文版,講的清楚)
2.動手實踐一下
 A.創建Dockerfile
 
 [root@iZbp1g8nzni5lhsdvd3a6aZ script_test]# cat Dockerfile 

FROM centos
LABEL maintainer="[email protected]"

RUN yum -y install expect \
&& yum -y install dos2unix

#再容器中創建shell_test_docker並改變權限

RUN mkdir shell_test_docker \
&& chmod 777 shell_test_docker 
#將Dockerfile所在路徑下的shell_test內容(該目錄下只有一個print_test.sh腳本)拷貝到容器目錄shell_test_docker
COPY ./shell_test shell_test_docker

#指定後續容器運行時需要執行的上下文目錄

WORKDIR shell_test_docker

RUN chmod 777 print_test.sh \
&& cd /shell_test_docker \
&& ./print_test.sh
ENTRYPOINT ["./print_test.sh"]

B.build 鏡像
docker build -t zw_shell_test:v1 .
下面是build打印:
Sending build context to Docker daemon  4.096kB
Step 1/8 : FROM centos
 ---> 0f3e07c0138f
Step 2/8 : LABEL maintainer="[email protected]"
 ---> Running in 0103bb129716
Removing intermediate container 0103bb129716
 ---> 33085ff163d1
Step 3/8 : RUN yum -y install expect && yum -y install dos2unix
 ---> Running in f973384ac248
CentOS-8 - AppStream                            2.6 MB/s | 6.3 MB     00:02    
CentOS-8 - Base                                 3.5 MB/s | 7.9 MB     00:02    
CentOS-8 - Extras                               101  B/s | 2.1 kB     00:21    
Dependencies resolved.
================================================================================
 Package         Arch            Version                  Repository       Size
================================================================================
Installing:
 expect          x86_64          5.45.4-5.el8             BaseOS          267 k
Installing dependencies:
 tcl             x86_64          1:8.6.8-2.el8            BaseOS          1.1 M

Transaction Summary
================================================================================
Install  2 Packages

Total download size: 1.4 M
Installed size: 4.7 M
Downloading Packages:
[MIRROR] tcl-8.6.8-2.el8.x86_64.rpm: Curl error (56): Failure when receiving data from the peer for http://mirror.lzu.edu.cn/centos/8.0.1905/BaseOS/x86_64/os/Packages/tcl-8.6.8-2.el8.x86_64.rpm [Recv failure: Connection reset by peer]
(1/2): expect-5.45.4-5.el8.x86_64.rpm           731 kB/s | 267 kB     00:00    
(2/2): tcl-8.6.8-2.el8.x86_64.rpm               420 kB/s | 1.1 MB     00:02    
--------------------------------------------------------------------------------
Total                                           330 kB/s | 1.4 MB     00:04     
warning: /var/cache/dnf/BaseOS-f6a80ba95cf937f2/packages/expect-5.45.4-5.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - Base                                 1.6 MB/s | 1.6 kB     00:00    
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key) <[email protected]>"
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : tcl-1:8.6.8-2.el8.x86_64                               1/2 
  Running scriptlet: tcl-1:8.6.8-2.el8.x86_64                               1/2 
  Installing       : expect-5.45.4-5.el8.x86_64                             2/2 
  Running scriptlet: expect-5.45.4-5.el8.x86_64                             2/2 
  Verifying        : expect-5.45.4-5.el8.x86_64                             1/2 
  Verifying        : tcl-1:8.6.8-2.el8.x86_64                               2/2 

Installed:
  expect-5.45.4-5.el8.x86_64              tcl-1:8.6.8-2.el8.x86_64             

Complete!
Last metadata expiration check: 0:00:06 ago on Tue Dec  3 08:23:28 2019.
Dependencies resolved.
================================================================================
 Package           Arch            Version                Repository       Size
================================================================================
Installing:
 dos2unix          x86_64          7.4.0-3.el8            BaseOS          241 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 241 k
Installed size: 666 k
Downloading Packages:
dos2unix-7.4.0-3.el8.x86_64.rpm                 634 kB/s | 241 kB     00:00    
--------------------------------------------------------------------------------
Total                                           104 kB/s | 241 kB     00:02     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : dos2unix-7.4.0-3.el8.x86_64                            1/1 
  Running scriptlet: dos2unix-7.4.0-3.el8.x86_64                            1/1 
  Verifying        : dos2unix-7.4.0-3.el8.x86_64                            1/1 

Installed:
  dos2unix-7.4.0-3.el8.x86_64                                                   

Complete!
Removing intermediate container f973384ac248
 ---> 78a662cb3b01
Step 4/8 : RUN mkdir shell_test_docker && chmod 777 shell_test_docker
 ---> Running in 7f6794c8d204
Removing intermediate container 7f6794c8d204
 ---> 3c8c4769b02d
Step 5/8 : COPY ./shell_test shell_test_docker
 ---> a0205096dfcb
Step 6/8 : WORKDIR shell_test_docker
 ---> Running in ceb35e80cbe0
Removing intermediate container ceb35e80cbe0
 ---> aedf9fb069bb
Step 7/8 : RUN chmod 777 print_test.sh && cd /shell_test_docker && ./print_test.sh
 ---> Running in 92e5e4069eab
hello dockter  //此處爲print_test.sh打印的內容,說明目錄進出訪問執行都沒有問題
Removing intermediate container 92e5e4069eab
 ---> 62ca449639e8
Step 8/8 : ENTRYPOINT ["print_test.sh"]
 ---> Running in 0ed2a73aeeca
Removing intermediate container 0ed2a73aeeca
 ---> 9dde304179dc
Successfully built 9dde304179dc
Successfully tagged zw_shell_test:v1
[root@iZbp1g8nzni5lhsdvd3a6aZ script_test]# 

C.運行image
[root@iZbp1g8nzni5lhsdvd3a6aZ script_test]# docker image list
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
zw_shell_test       v1                  9dde304179dc        About a minute ago   266MB
centos              latest              0f3e07c0138f        2 months ago         220MB

docker run -d 9dde304179dc  //後臺運行

報錯如下:反覆都查找不到原因
d2f5b90ee9db112253f9d66130a0463c1b530d8a540359be04301eb19bb2d403
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"print_test.sh\": executable file not found in $PATH": unknown.

查了很多資料,說是路徑或權限的問題,乾脆從新修改Dockerfile,刪除最後一行:ENTRYPOINT ["./print_test.sh"],再次運行進去看看該腳本到底有沒有執行權限以及目錄問題

重新編譯
再次運行:docker container run -idt 37ff5cc05f28  //該命令是後臺shell的方式運行image,便於調試,和一般運行參數不同
//發現up成功了,說明是那條ENTRYPOINT使用有問題
[root@iZbp1g8nzni5lhsdvd3a6aZ script_test]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                        PORTS               NAMES
f69659e40111        37ff5cc05f28        "/bin/bash"         30 seconds ago       Up 29 seconds                                     silly_varahamihira
再次進入該容器:docker container exec -it f69659e40111 bash
//發現容器內當前路徑確實是我們在Dockerfile中WORKDIR設置的默認路徑
[root@f69659e40111 shell_test_docker]# pwd
/shell_test_docker
[root@f69659e40111 shell_test_docker]# ls -al
total 12
drwxrwxrwx 1 root root 4096 Dec  3 08:31 .
drwxr-xr-x 1 root root 4096 Dec  3 08:33 ..
-rwxrwxrwx 1 root root   31 Dec  3 02:34 print_test.sh  //在容器中查看該腳本權限也是可讀可寫可執行,那爲什麼原Dockerfile報錯呢

[root@f69659e40111 shell_test_docker]# ./print_test.sh  //在容器中執行該腳本也能順利執行,那到底爲什麼原Dockerfile報錯
hello dockter


問題解決:
docker image inspect zw_shell_test:v1,
看查是路徑似乎不對
將ENTRYPOINT ["./print_test.sh"] 修改成ENTRYPOINT ["print_test.sh"]
重編譯一下
docker stop $(docker ps -q) & docker rm $(docker ps -aq)  //刪除所有已經運行的容器
docker image rm 744c0eba96fe //刪除舊的image
docker build -t zw_shell_test:v1 . //再次編譯
docker run -d zw_shell_test:v1  //運行image
還是出現:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"print_test.sh\": executable file not found in $PATH": unknown.

既然目錄和路徑執行權限都對,看到提示$PATH,那麼是不是環境變量有問題呢,再次docker image inspect zw_shell_test:v1,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"   //這裏並沒有我們要執行的腳本路徑
            ],
            "Cmd": null,


所以我們嘗試一下添加執行腳本的環境變量看看,在Dockerfile中添加一行:
ENV PATH /shell_test_docker:$PATH   //將shell所在路徑添加到環境變量目錄路徑中
重編後再次docker image inspect zw_shell_test:v1,
            "Env": [
                "PATH=/shell_test_docker:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"   //這裏出現要執行的腳本路徑
            ],
            "Cmd": null,
            
            
再次運行image
container ps -al
[root@iZbp1g8nzni5lhsdvd3a6aZ script_test]# docker ps -al           
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
b202e5b4f82b        zw_shell_test:v1    "print_test.sh"     5 minutes ago       Exited (0) 5 minutes ago                       nervous_cohen
發現雖然沒報錯,但是出於Exited狀態。百思不得其解。

查了很多資料,包括官網文檔,發現Entrypoint其實相當於main函數,main執行完了,進程就退出了,Entrypoint也是這樣。所以執行完shell腳本就退出了,這個狀態是對的。

C.下面我們寫一段代碼,保持主循環,再從Entrypoint啓動。
再shell_test目錄下添加測試代碼test.c並編譯成test執行程序:
[root@iZbp1g8nzni5lhsdvd3a6aZ shell_test]# cat test.c 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{


        while(1)
        {

        }

        return 1;
}


修改Dockerfile如下:
#test for omm
FROM centos
LABEL maintainer="[email protected]"

RUN yum -y install expect \
&& yum -y install dos2unix

#拷貝Dockerfile所在目錄下CNV4WG文件夾到運行容易目錄中

RUN mkdir shell_test_docker \
&& chmod 777 shell_test_docker

COPY ./shell_test shell_test_docker

#設置環境變量,後續函數入口默認調用程序先從這裏找
ENV PATH /shell_test_docker:$PATH
#設置容器工作目錄,進入容器後默認就是該目錄
WORKDIR shell_test_docker

RUN chmod 777 print_test.sh \
&& ./print_test.sh                          //注意改行是之前執行的腳本,執行腳本之類的我們可以使用run執行即可

ENTRYPOINT ["./test"]    //啓動一個不會執行退出的應用程序


重編譯發現問題:
[root@iZbp1g8nzni5lhsdvd3a6aZ script_test]# docker build -t zw_shell_test:v1 .
Sending build context to Docker daemon  15.36kB
Step 1/9 : FROM centos
 ---> 0f3e07c0138f
Step 2/9 : LABEL maintainer="[email protected]"
 ---> Running in 4719322c9603
Removing intermediate container 4719322c9603
 ---> b9b54d7c3938
Step 3/9 : RUN yum -y install expect && yum -y install dos2unix
 ---> Running in 16692b61fee5
CentOS-8 - AppStream                            571 kB/s | 6.3 MB     00:11    
CentOS-8 - Base                                 0.0  B/s |   0  B     00:23    
CentOS-8 - Extras                               2.5 kB/s | 2.1 kB     00:00    
Failed to synchronize cache for repo 'BaseOS', ignoring this repo.
No match for argument: expect
Error: Unable to find a match
The command '/bin/sh -c yum -y install expect && yum -y install dos2unix' returned a non-zero code: 1    //單獨執行可以成功,有可能是雲環境網絡出現問題。


重新編譯一次,發現變成成功。然後再次啓動image。
[root@iZbp1g8nzni5lhsdvd3a6aZ script_test]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
12d42e366c07        zw_shell_test:v1    "./test"                 16 seconds ago      Up 15 seconds                                  vigilant_khayyam

爲UP狀態,我們自制的容器啓動成功了。

下面進去一探,後臺shell執行進去。
docker container exec -it 12d42e366c07 bash      

[root@iZbp1g8nzni5lhsdvd3a6aZ script_test]# docker container exec -it 12d42e366c07 bash
[root@12d42e366c07 shell_test_docker]# pwd
/shell_test_docker
[root@12d42e366c07 shell_test_docker]# ls -al
total 32
drwxrwxrwx 1 root root 4096 Dec  4 06:52 .
drwxr-xr-x 1 root root 4096 Dec  4 06:53 ..
-rwxrwxrwx 1 root root   55 Dec  3 11:24 print_test.sh
-rwxr-xr-x 1 root root 9536 Dec  4 02:21 test
-rw-r--r-- 1 root root  106 Dec  4 02:21 test.c
drwxr-xr-x 2 root root 4096 Dec  4 06:52 test_test_Test
[root@12d42e366c07 shell_test_docker]# cat print_test.sh 
#!/bin/bash
mkdir test_test_Test
[root@12d42e366c07 shell_test_docker]# expect
expect1.1> 
[root@12d42e366c07 shell_test_docker]# dos2unix --help
Usage: dos2unix [options] [file ...] [-n infile outfile ...][root@12d42e366c07 shell_test_docker]# export
declare -x HOME="/root"
declare -x HOSTNAME="12d42e366c07"
declare -x LANG="en_US.UTF-8"
declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
declare -x OLDPWD
declare -x PATH="/shell_test_docker:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"    //我們Dockerfile中定義的環境變量
declare -x PWD="/shell_test_docker"
declare -x SHLVL="1"
declare -x TERM="xterm"


發現我們在Dockerfile執行的東西都已經存在在容器中了。

總結:初探容器的使用,發現容器真是太強大了,可以在一臺機器上構建自己不同的應用,無數個開發者可以在其中構建自己的開發環境。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章