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执行的东西都已经存在在容器中了。

总结:初探容器的使用,发现容器真是太强大了,可以在一台机器上构建自己不同的应用,无数个开发者可以在其中构建自己的开发环境。
 

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