Docker镜像的分层、打包、双向绑定、同步、导入导出、Dockerfile的构建、部署与发布
这里推荐B站狂神的教学视频,视频的地址附录在文章末尾,个人觉得还是讲得不错的。以下的一些学习记录参看了该视频,希望对大家有帮助。
一、镜像分层的理解
例如下载一层一层的:
1.0、联合文件
以前下载过的可不再下载,共用就行,极大节省了空间。
1.1、加载镜像
如何进行加载镜像?
加载引导类似我们ubuntu里面的boot,无论什么镜像,bootfs都是共用的
例如启动后,root文件下进行一个容器作为小的虚拟机。
1.2、分层拉取镜像
可以发现,已有的层就不在重复拉取,因此显示存在(already exists)
我们可以通过前面说的inspect查询镜像信息,然后来查看层layers
创建新的层会在层的基础上继续添加就可以。
1.3、案例分析:tomcat
二、提交自己的镜像
如何提交自己的镜像?
2.1、提交自己的镜像
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
2.2、实战测试
运行tomcat 镜像 :又看到熟悉的猫,docker安装运行完成:
docker run -it --rm -p 8989:8080 tomcat
具体看下面的命令解释
root@ovo:/home/zkpark# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9fa71eb085d tomcat "catalina.sh run" 58 seconds ago Up 57 seconds 8080/tcp, 0.0.0.0:8989->8989/tcp vigilant_beaver
87e59469fb99 rancher/server "/usr/bin/entry /usr…" 21 hours ago Up 14 hours 3306/tcp, 0.0.0.0:9090->8080/tcp rancher-zk
964fd0b86e14 e02481bb39c8 "entrypoint.sh" 23 hours ago Restarting (1) About a minute ago blissful_mclean
#运行tomcat容器
root@ovo:/home/zkpark# docker exec -it b9fa71eb085d /bin/bash
root@b9fa71eb085d:/usr/local/tomcat# cd webapps
#目前没有任何东西,所以要从webapps.dist拷贝
root@b9fa71eb085d:/usr/local/tomcat/webapps# ls
root@b9fa71eb085d:/usr/local/tomcat/webapps# cd ..
#拷贝
root@b9fa71eb085d:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@b9fa71eb085d:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
#进入webapps查看是否拷贝成功
root@b9fa71eb085d:/usr/local/tomcat# cd webapps
root@b9fa71eb085d:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
root@b9fa71eb085d:/usr/local/tomcat/webapps# cd
root@b9fa71eb085d:~# exit
exit
#查看当前tomcat进程
root@ovo:/home/zkpark# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9fa71eb085d tomcat "catalina.sh run" 6 minutes ago Up 6 minutes 8080/tcp, 0.0.0.0:8989->8989/tcp vigilant_beaver
87e59469fb99 rancher/server "/usr/bin/entry /usr…" 21 hours ago Up 14 hours 3306/tcp, 0.0.0.0:9090->8080/tcp rancher-zk
964fd0b86e14 e02481bb39c8 "entrypoint.sh" 23 hours ago Restarting (1) 43 seconds ago
提交新的tomcat:
docker commit -a"zk" -m="add webapps app" 606e2ead236d tomcat_2021:zk1.0
可以发现刚刚新建提交的tomcat_2021镜像
三、容器数据卷
3.0、问题描述与需求分析
3.1、双向绑定指定目录流程
挂载到主机与docker容器内的相同目录,事实上就是一种双向绑定的操作。
3.2、双向绑定实战测试
3.2.1、挂载流程
首先主机cd到 home该目录下:
root@ovo:/home/zkpark# cd /home
root@ovo:/home# ls
lost+found ovo.py zkpark zkpy
然后开始进行绑定操作:这个命令执行后直接进入了centos镜像的容器下:
docker run -it -v /home/ceshi:/home centos
ls查看当前目录文件
root@ovo:/home# docker run -it -v /home/ceshi:/home centos /bin/bash
[root@508e05fae9c2 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
进入该容器的home目录,让它与ubuntu主机下的home保持一样。可以发现。当前目录下没有任何文件:
[root@508e05fae9c2 /]# cd /home
[root@508e05fae9c2 home]# ls
[root@508e05fae9c2 home]#
下面我们来docker inspect 508e05fae9c2查看一下该容器的挂载信息,挂载的内容在mounts下,记得另起一个终端,在root下查看:
root@ovo:/home/zkpark# docker inspect 508e05fae9c2
找到mounts,如下图所示,说明挂载成功!
3.2.1、绑定:从centos生成的文件同步到主机ubuntu的文件
下面在容器的home下创建一个文件,并查看:
[root@508e05fae9c2 home]# touch sinxzy.py
[root@508e05fae9c2 home]# ls
sinxzy.py
接下来去我们的主机的home的ceshi目录下查看是不是有该文件的生成:
root@ovo:/home# ls
ceshi lost+found ovo.py zkpark zkpy
root@ovo:/home# cd ceshi
root@ovo:/home/ceshi# ls
root@ovo:/home/ceshi# ls
sinxzy.py
可以发现,刚刚在容器中创建的py文件同样在ubuntu主机目录/home/ceshi下生成。
测试成功!
3.2.1、绑定:反之
这里先将centos容器停掉:exit或stop都可以,可以发现没有了。
注意:如果你没有python,那就先拉一下python3.7:
docker pull python:3.7
以下用.py文件进行测试并运行。
[root@508e05fae9c2 home]# exit
exit
root@ovo:/home# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87e59469fb99 rancher/server "/usr/bin/entry /usr…" 25 hours ago Up 17 hours 3306/tcp, 0.0.0.0:9090->8080/tcp rancher-zk
964fd0b86e14 e02481bb39c8 "entrypoint.sh" 26 hours ago Restarting (1) 2 seconds ago blissful_mclean
下面在ubuntu主机home/ceshi目录下创建test.y文件
root@ovo:/home/ceshi# vim test.py
root@ovo:/home/ceshi# ls
sinxzy.py test.py
编写内容:
先来测试一下py文件
#vim生成py文件
root@ovo:/home/ceshi# vim test.py
root@ovo:/home/ceshi# ls
sinxzy.py test.py
# cat查看test.py文件目录
root@ovo:/home/ceshi# cat test.py
print("helloworld!!!!")
#运行py
root@ovo:/home/ceshi# python test.py
helloworld!!!!
root@ovo:/home/ceshi#
退出保存该文件之后,在另一终端再次启动刚刚的centos容器,并且进入到该容器内部:
root@ovo:/home# docker start 508e05fae9c2
508e05fae9c2
root@ovo:/home# docker attach 508e05fae9c2
[root@508e05fae9c2 /]#
查看容器内是否有我们主机ubuntu生成的py文件:
[root@508e05fae9c2 home]# ls
sinxzy.py test.py
[root@508e05fae9c2 home]# cat test.py
print("helloworld!!!!")
测试成功!
3.3、具名和匿名挂载
实战测试:
#匿名挂载
root@ovo:/home/zkpark# docker run -d -P --name nginxo1 -v /etc/nginx nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
45b42c59be33: Already exists
d0d9e9ea897e: Pull complete
66e650438339: Pull complete
76a3dfe4406b: Pull complete
410ff9d97480: Pull complete
Digest: sha256:8e10956422503824ebb599f37c26a90fe70541942687f70bbdb744530fc9eba4
Status: Downloaded newer image for nginx:latest
85d45164923481993fa6573e92f43d200297eebb59cbc43c930e8b836b3998f9
#查看卷帮助
root@ovo:/home/zkpark# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.
#查看容器卷
root@ovo:/home/zkpark# cd /home
root@ovo:/home# docker volume ls
DRIVER VOLUME NAME
local 4a1c234fa82076b83d5e4a0bfa45992f6172331b0acd40c9e2543c4e24bfcd1e
...
local
5d57a873e575368e452a1fcfea9ffb5227eefaa0782f5097b11c5eb251755a4f
local 8e9f3eeba7a8c7e5a3ac24105f2be9dd30d0d4d599920827c6c1fc9019da5c55
#具名挂载
root@ovo:/home# ls
ceshi lost+found ovo.py zkpark zkpy
root@ovo:/home# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
dfa75db144ed24b13bafeabacc0dceac35ebeb5d79f3caa07f64979198124278
#再次查看卷,出现刚刚的具名
root@ovo:/home# docker volume ls
DRIVER VOLUME NAME
local 4a1c234fa82076b83d5e4a0bfa45992f6172331b0acd40c9e2543c4e24bfcd1e
...
local fda6e9fc04e53effda927f4b75867f0d5d88aee6b9604ed9e7857ad6d941bc00
local juming-nginx
#查看具名挂载信息可以知道挂载的指定目录
root@ovo:/home# docker volume inspect juming-nginx
[
{
"CreatedAt": "2021-02-17T18:59:31+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
#看看挂载卷信息
root@ovo:/home# cd /var/lib/docker
root@ovo:/var/lib/docker# ls
buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
root@ovo:/var/lib/docker# cd volumes
#与上述docker volume ls查看的结果一致
root@ovo:/var/lib/docker/volumes# ls
062365c8669bbe6f55fd706b3b3b1e767c843e27ae066bae8e107372ab9bec02
.....
fda6e9fc04e53effda927f4b75867f0d5d88aee6b9604ed9e7857ad6d941bc00
juming-nginx
metadata.db
#查看具名数据
root@ovo:/var/lib/docker/volumes# cd juming-nginx
root@ovo:/var/lib/docker/volumes/juming-nginx# ls
_data
root@ovo:/var/lib/docker/volumes/juming-nginx# cd _data
root@ovo:/var/lib/docker/volumes/juming-nginx/_data# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
#查看具名配置文件.conf
root@ovo:/var/lib/docker/volumes/juming-nginx/_data# cat nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
四、Dockerfile构建镜像
4.0、初始Dockerfile
构建镜像命令:
docker build -f /home/docker-test-volume/dockerfile1 -t zkang/centos:1.0 .
下面开始测试:为构建镜像编辑dockerfile1文件
root@ovo:/home# mkdir docker-test-volume
root@ovo:/home# cd docker-test-volume/
root@ovo:/home/docker-test-volume# pwd
/home/docker-test-volume
root@ovo:/home/docker-test-volume# vim dockerfile1
内容如下:
开始构建镜像:
root@ovo:/home/docker-test-volume# docker build -f /home/docker-test-volume/dockerfile1 -t zkang/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 39d9337d47d3
Removing intermediate container 39d9337d47d3
---> 9a376911dbe8
Step 3/4 : CMD echo "----end----"
---> Running in 0f8efc81d3ab
Removing intermediate container 0f8efc81d3ab
---> fd3540783461
Step 4/4 : CMD /bin/bash
---> Running in d01f156f514f
Removing intermediate container d01f156f514f
---> fe9f6e6d328c
Successfully built fe9f6e6d328c
Successfully tagged zkang/centos:1.0
查看我们创建的镜像
root@ovo:/home/docker-test-volume# docker images
验证我们创建的镜像是否有问题?
首先运行我们的zkang/centos镜像、查看目录
#查看刚刚创建的镜像名字id
root@ovo:/home/docker-test-volume# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zkang/centos 1.0 fe9f6e6d328c 8 minutes ago 209MB
tomcat_2021 zk1.0 510b23d401fb 6 hours ago 667MB
ultralytics/yolov3 latest 5a831834fc3e 11 hours ago 14.5GB
python 3.7 9c9ca311176f 16 hours ago 877MB
tomcat latest bf4709e77b18 7 days ago 667MB
#运行我们的镜像
root@ovo:/home/docker-test-volume# docker run -it fe9f6e6d328c /bin/bash
#查看我们的镜像目录
[root@14b1bc4c1003 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Feb 17 11:44 dev
drwxr-xr-x 1 root root 4096 Feb 17 11:44 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 285 root root 0 Feb 17 11:44 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Feb 17 11:44 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Feb 17 11:44 volume01
drwxr-xr-x 2 root root 4096 Feb 17 11:44 volume02
查看自动挂载的匿名挂载volume01:
#进入创建的容器
root@ovo:/home/docker-test-volume# cd
root@ovo:~# docker run -it fe9f6e6d328c /bin/bash
[root@682bd4a36e56 /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01
#创建验证同步的文件container.txt
[root@682bd4a36e56 /]# cd volume01
[root@682bd4a36e56 volume01]# touch container.txt
#当前位置container.txt是在容器内
[root@682bd4a36e56 volume01]# ls
container.txt
下面在主机外面,也就是容器外面查看是否同步有
root@ovo:/home/zkpark# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
682bd4a36e56 fe9f6e6d328c "/bin/bash" 2 minutes ago Up 2 minutes jovial_elbakyan
dfa75db144ed nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:49154->80/tcp nginx02
查看刚刚的容器信息
root@ovo:/home/zkpark# docker inspect 682bd4a36e56
发现有了挂载的卷:
进入卷vulume挂载路径:发现已经有了container.txt,同步测试成功!
root@ovo:/home/zkpark# cd /var/lib/docker/volumes/80920528ecba3d51466e7ddcb110e1c739f1063b4e2308fde9f1cec257557080/_data
root@ovo:/var/lib/docker/volumes/80920528ecba3d51466e7ddcb110e1c739f1063b4e2308fde9f1cec257557080/_data# ls
container.txt
4.1、数据卷容器:多个容器之间进行同步
多个centos同步:
docker01:在docker0的卷volume01中创建文件docker_AB01
docker run -it --name docker01 zkang/centos:1.0
测试:
root@ovo:~# docker run -it --name docker01 zkang/centos:1.0
[root@4e70f7b94ed7 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Feb 17 12:23 dev
drwxr-xr-x 1 root root 4096 Feb 17 12:23 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 322 root root 0 Feb 17 12:23 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Feb 17 11:44 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Feb 17 12:23 volume01
drwxr-xr-x 2 root root 4096 Feb 17 12:23 volume02
[root@4e70f7b94ed7 /]# cd volume01
[root@4e70f7b94ed7 volume01]# ls
[root@4e70f7b94ed7 volume01]# touch docker_AB01
[root@4e70f7b94ed7 volume01]# ls
docker_AB01
docker02:在在docker02的卷volume01中可以看到docker01创建的文件docker_AB01
docker run -it --name docker02 --volumes-from docker01 zkang/centos:1.0
测试:
root@ovo:~# docker run -it --name docker02 --volumes-from docker01 zkang/centos:1.0
[root@7d9d13472154 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Feb 17 12:26 dev
drwxr-xr-x 1 root root 4096 Feb 17 12:26 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 303 root root 0 Feb 17 12:26 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Feb 17 11:44 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Feb 17 12:23 volume01
drwxr-xr-x 2 root root 4096 Feb 17 12:23 volume02
[root@7d9d13472154 /]# cd volume01
[root@7d9d13472154 volume01]# ls
docker_AB01
类似地,也可以在其他新的位置创建文件,docker01也能看到。
docker03:在docker03的卷volume01中生成文件docker_AB02之后,反过来在docker01中也能查到
docker run -it --name docker03 --volumes-from docker01 zkang/centos:1.0
测试:
root@ovo:/home/zkpark# docker run -it --name docker03 --volumes-from docker01 zkang/centos:1.0
[root@a2260985213d /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Feb 17 12:40 dev
drwxr-xr-x 1 root root 4096 Feb 17 12:40 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 343 root root 0 Feb 17 12:40 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Feb 17 11:44 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Feb 17 12:29 volume01
drwxr-xr-x 2 root root 4096 Feb 17 12:23 volume02
[root@a2260985213d /]# cd volume01
[root@a2260985213d volume01]# touch docker_AB02
[root@a2260985213d volume01]# ls
docker_AB01 docker_AB02
然后我们返回docker01查看是否有以上生成的另一文件docker_AB02。
查看之后发现也有文件docker_AB02,测试成功!
停掉/删除docker01的文件,原来0203的数据依旧在
删除docker01容器:
root@ovo:/home/zkpark# docker rm -f 4e70f7b94ed7
4e70f7b94ed7
root@ovo:/home/zkpark#
查看docker02和docker03的数据是否还在:文件依旧在,测试成功!
4.2、Dockerfile
4.2.0、Dockerfile介绍
4.2.1、Dockerfile构建过程
例如,之前的初始Dockerfile:
4.2.2、Dockerfile构建命令
4.2.3、实战测试:构建Dockerfile
先看看别人怎么做的?
官方没有的功能:
因此需要添加这些功能:
通过命令docker history 镜像id
可查别人的镜像是怎么生成的。这样就知道他人的镜像是怎么做的了,便于以后衍生更多的Dockerfile。
解决的办法:
实战Dockerfile-tomcat
4.2.4、Dockerfile构建tensorflow环境
学以致用!
方法一
第一步:先 docker search ubuntu 查找到ubuntu的镜像。
docker search ubuntu
第二步: docker pull ubuntu
,完成之后使用 docker images 查看pull下来的镜像,很小只有120M。
docker images
第三步: docker run -ti -d --name tensorflow ubuntu bash
创建容器。
docker ps -a
第四步: docker exec -ti tensorflow bash
进入容器。
docker exec -ti tensorflow bash
第五步:就是在内部使用apt 安装软件了,不过在安装软件之前需要先 apt update 下,要不使用apt 就无法安装软件包。
下面直接给出软件的安装命令。这些安装命令都是tensorflow官网上的,如果安装过程中出现啥问题,点这里,然后查找"Installing with native pip",看下官网的文档。还有一点需要注意的就是ubuntu的基础镜像里面没有vim,所以安装的时候也将vim装上。
apt update
apt install -y python3-pip python3-dev vim
pip3 install tensorflow
pip3 install tensorflow-gpu #这个我目前还没有用到,所以我没有安装
安装完成之后,使用下面这块代码测试下:
复制代码
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
复制代码
最后一步:就是将安装好软件的容器,提交到镜像中。使用命令 docker commit tensorflow tensorflow:20170827
docker images
方法二
使用Dockerfile文件构建镜像,这个比较简单,下面直接贴出来Dockerfile文件内容:
# 构建tensorflow 环境
FROM ubuntu
MAINTAINER henrry
# 安装python 和 pip
RUN apt update \ && apt install -y python3-pip python3-dev vim \ && pip3 install --upgrade pip \
&& pip3 install tensorflow \ && pip3 install tensorflow-gpu \ && ln -s /usr/bin/python3 /usr/bin/python \
&& ln -s /usr/bin/pip3 /usr/bin/pip
# 映射端口
EXPOSE 8888# 添加文件
ADD vimrc /root/.vimrc
4.2.5、发布自己的docker镜像
发布镜像流程介绍:
解决以上push报错的问题,报错的原因是以前就push过了。
五、镜像和容器的打包与导入
未完待续。。。。
参考资料
参考视频:
https://www.bilibili.com/video/BV1og4y1q7M4?p=21&spm_id_from=pageDriver
https://blog.csdn.net/xiaozecheng/category_10013756.html