docker练习-自定义容器
虽然dockerhub上有丰富的镜像资源供我们选择,但是我们想要运行一个包含自己项目的容器就需要自定义一个镜像,该镜像中包含自定义项目的运行资源。
例:需要一个容器运行教管系统。
步骤1:下载基础镜像
我们的项目运行需要依赖其他资源,因此需要在基础镜像的容器上,去创建容器。教管系统是基于python的Django项目,因此呢,环境资源中必须有python,最好是python3
[root@localhost ~]# docker pull python:3.6
3.6: Pulling from library/python
e4c3d3e4f7b0: Pull complete
101c41d0463b: Pull complete
8275efcd805f: Pull complete
751620502a7a: Pull complete
0a5e725150a2: Pull complete
9ab4bf1101f3: Pull complete
9ba108bf0aed: Pull complete
eac75d8e87c4: Pull complete
3c6283a6d761: Pull complete
Digest: sha256:2031db444b66aac1cd179a5ce85e87dc56bcddc411c2eafe73142347fe026b51
Status: Downloaded newer image for python:3.6
docker.io/library/python:3.6
步骤2:运行容器并进入该容器内部
[root@localhost ~]# docker run -it -d python:3.6 #创建容器
c557599a0669d8f1e6662999904652d303cd1daa98bd8d4ab3720240c7663497
[root@localhost ~]# docker exec -it c557599a0669 /bin/bash #进入容器内部
root@c557599a0669:/# 这里是容器内部
root@c557599a0669:/# exit #退出容器
exit
进入容器的语法是
docker exec -it 容器ID或容器名 /bin/bash
步骤3:将教管系统文件拷贝到容器内部
利用FTP工具把教官系统拷贝到虚拟机中(CentOs7)
安装解压工具unzip,如果已安装,跳过这一步
yum install -y unzip
解压教管系统包
unzip yum
将教官系统目录完整拷贝到容器中/opt目录下,或者进入容器自定义一个目录
docker cp restapi-teach c557599a0669:/opt
docker cp 外部文件 目标容器ID:容器内路径
进入容器-查看文件
[root@localhost ~]# docker exec -it c557599a0669 bash
root@c557599a0669:/# ls opt/
restapi-teach
root@c557599a0669:/# ls opt/restapi-teach/
backend install.bat run.bat static
执行install.bat里面的命令
root@c557599a0669:cd /opt/restapi-teach #切到对应目录
root@c557599a0669:/opt/restapi-teach# pwd
/opt/restapi-teach
root@c557599a0669:/opt/restapi-teach# cat install.bat #查看内容,复制出来放在命令行执行
pip install django==2.0.4 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install cherrypy -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
测试服务是否可以运行
root@c557599a0669:/opt/restapi-teach# cd backend/ #进入backend目录
root@c557599a0669:/opt/restapi-teach/backend# python project/cherrypy_startup.py #启动服务
[16/Oct/2020:15:41:45] ENGINE Bus STARTING
[16/Oct/2020:15:41:45] ENGINE Started monitor thread 'Autoreloader'.
[16/Oct/2020:15:41:45] ENGINE Serving on http://0.0.0.0
[16/Oct/2020:15:41:45] ENGINE Bus STARTED
步骤4:提交镜像
ctrl+c结束服务,exit退出容器
查看当前镜像,此时,python容器是我们修改过后的了,我们只需保存此次修改
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c557599a0669 python:3.6 "python3" About an hour ago Up About an hour boring_hellman
提交镜像内容
docker commit -m "init restapi-teach" c557599a0669 restapi-teach:v1
这个命令的语法是
# docker commit [OPTIONS] 容器ID或容器名 镜像名:版本号
其中选项可以不填
-a :提交的镜像作者;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
查看当前系统docker镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
restapi-teach v1 5749a603c9b8 2 minutes ago 913MB
发现已经多了一个自定义的
docker练习-启动自定义镜像
下面可以通过该镜像创建一个容器并运行教管系统
docker run -it -d -p 8080:80 restapi-teach:v1 bash -c "cd /opt/restapi-teach/backend && python project/cherrypy_startup.py"
执行多个命令,所以bash后面加-c参数 命令之间需要以&&符号连接
访问服务地址,
http://192.168.21.142:8080/mgr/ps/mgr/index.html#/
把IP和端口号替换成你自己虚拟机的。发现可以访问教管系统。
docker练习-共享镜像
镜像完成后我们希望可以共享这个镜像,那么别人可以直接下载下来就可以用。通常我们可以推送到自己公司的镜像服务器或者dockerhub, 如果推送到dockerhub需要提前登录docker仓库,方法如下
进入dockerhub,注册一个账号,注册流程很简单,这步略过,实在不会可以百度。
有了账号之后需要在命令行用docker登录此账号
[root@localhost ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: #这里输入用户名
Password: #这里输入密码
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
看到login succeeded表示登录成功
如果以后想要换公司的私有镜像仓库,
docker logout #先登出
docker login #后面跟私有仓库地址 如: docker login http://xxx.com
#输入用户名和密码
此时可以推送镜像到dockerhub了,鉴于网速可能会很慢
推送的语法是docker push 镜像名:版本
[root@localhost ~]# docker push restapi-teach:v1
The push refers to repository [docker.io/library/restapi-teach]
b379057de283: Preparing
079d30d9c3eb: Preparing
28c41b4dd660: Preparing
36957997ca7a: Preparing
5c4d527d6b3a: Preparing
a933681cf349: Waiting
f49d20b92dc8: Waiting
fe342cfe5c83: Waiting
630e4f1da707: Waiting
9780f6d83e45: Waiting
denied: requested access to the resource is denied
发现推送被拒绝,此时需要修改我的镜像名称,前面加上docker hub的用户名
[root@localhost ~]# docker tag 5749a603c9b8 shonekey/restapi-teach:v1 #标记镜像
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# docker images #再次查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
restapi-teach v1 5749a603c9b8 3 hours ago 913MB
shonekey/restapi-teach v1 5749a603c9b8 3 hours ago 913MB
...
此时推送镜像,网速问题肯能会耗费比较长时间,镜像不要做太大,耐心等待
[root@localhost ~]# docker push shonekey/restapi-teach:v1
The push refers to repository [docker.io/shonekey/restapi-teach]
b379057de283: Pushing [> ] 406kB/38.56MB
079d30d9c3eb: Pushing [==================================================>] 7.771MB
28c41b4dd660: Pushing [==================================================>] 4.608kB
36957997ca7a: Pushing [==> ] 2.335MB/45.51MB
5c4d527d6b3a: Preparing
a933681cf349: Waiting
f49d20b92dc8: Waiting
fe342cfe5c83: Waiting
630e4f1da707: Waiting
9780f6d83e45: Waiting
镜像推送完成,最后登录自己的Docker Hub,即https://hub
.docker.com/ 登录后,在Repositories里面就可以看到自己在上面推送的镜像shonekey/restapi-teach:v1了,这是个对外的镜像,可以在网络上下载。 在Docker hub上可以看到这个镜像的下载命令(注意下载时跟上tag标签,如果是latest的默认tag可以不跟) 也可以直接在Docker hub上删除这个镜像(Repositories-镜像-Settings-delete)
此时可以再另外一台机器上拉取该镜像
docker pull shonekey/restapi-teach:v1
注意需要带上版本号