Docker使用
首先,了解了下,我直接把它看做虚拟机.
里面有两个概念
image
和container
,image
可能相当于系统的镜像,比如win7之类的,而container
相当于计算机,把镜像安装在计算机中,构成了一个独立的环境.
比如说我的linux是一个系统,它相当于运行在我linux上的一个虚拟机,项目,就运行在Docker这个虚拟机内,迁移的时候,或者部署的时候,只用动这个虚拟机就行了,里面有着成套的环境,非常方便.我甚至可以在docker的image内布置一个ubuntu系统,然后在其中跑各种环境.首先摆上两个网址供给参考:
- docker文档
- docker镜像管理库,作用像github之于代码一样
- docker中文文档gitbook
一 基本操作
- 安装(环境centos6.5):先升级库,否则docker服务会启动失败,执行:
yum upgrade device-mapper-libs
之后执行下列命令来安装:
yum install -y docker-io
启动,停止,重启
servive docker start
servive docker stop
servive docker restart
- 安装(环境ubuntu16.06+):分别执行:
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
之后执行下列命令来安装:
sudo apt-get update
sudo apt-get install docker-ce
启动,停止,重启等状态
systemctl start docker
systemctl stop docker
systemctl status docker
-
例子,构建自己的image:以运行一个Python2.7的flask应用为简单的例子,假定工作的目录是:
/home/app
,目录内有以下文件:app.py
,requirements.txt
,.dockerignore
,Dockerfile
# app.py 是应用文件
from flask import Flask
import os
import socket
app = Flask(__name__)
@app.route("/")
def hello():
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8088)
# requirements.txt , python应用的依赖文件
Flask
# .dockerignore 忽略加入image的文件
README.MD
# Dockerfile,docker的配置文件,按照这个来打包
# https://docs.docker.com上提供的版本镜像
FROM python:2.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# 运行安装依赖的命令
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 暴露端口给linux真实机器,就是flask监听的端口
EXPOSE 8088
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
好了之后,就要构建image虚拟机(box)(镜像),运行:
docker build -t flask_application # 构建名字叫做flask_application的image
查看image:
docker images # 我的centos上是如此的 运行docker可以查看相关命令
运行这个image命令:
# 将8888端口,映射到8088,外部访问时候访问8888就行
docker run -p 8888:8088 flask_application[Image name]
然后,在浏览器输入server_pi:8888,就可以看到flask返回的内容了.
-
Image的管理:有了image之后,将它提交到docker库,从其他服务器上下载下来,直接就可以用了,不需要再次部署环境.
首先,要在docker库注册账号,然后在安装了docker并且有image的服务器上,运行:
# 登陆docker
docker login
根据提示输入相关信息,然后,登陆成功,之后,提交自己的image:
# 给image做版本
docker tag [imageName] [username]/[repository]:[tag]
docker tab flask_application docker_username/flask_application:1.0.0
然后,推上去,像git:
docker image push docker_username/flask_application:1.0.0
然后就保存着了,如果其他服务器上要用,可以进入仓库,查看pull的地址,然后执行:
# 仓库中查看到的命令和相关版本信息
docker pull docker_username/flask_application:1.0.0
确实是很方便,而且想法很新,移植性非常的强,但是还是有问题:网站可能是外国的,pull时候太慢,如果项目比较复杂,构建起来也是很麻烦单靠Dockerfile.
二 微服务器部署例子
每个docker容器,就是一个微小的服务器了,打包了所有的环境,使得服务器上只需要有docker,不需要配置其他的环境了,可以避免一个服务挂了,项目之间的附带影响. 比如部署一个ubuntu.
这个后来才知道非常好的,我使用一个虚拟docker镜像ubuntu运行在我的实际的ubuntu上,然后,开通ssh的port,然后,我直接就可以使用docker的虚拟机子而不使用我正常的环境了,避免出错得很!
- 首先pull镜像
docker pull ubuntu
如果镜像网络太慢,可以配置成国内的镜像.首先找到docker配置文件,我的目录是:
# centos6.5
vim /etc/sysconfig/docker
# 最后一行加入
DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"
# 重启
service docker restart
# ubuntu16.04 ,如果不存在就添加
vim /etc/docker/daemon.json
# 加上:
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
# 重启
systemctl restart docker
然后保存,重启动docker服务.之后要进入ubuntu镜像,只需要:
# 映射主机80到虚拟机80
# 映射主机/data目录到虚拟机的/data目录
# 运行命令行centos
docker run -p 80:80 -v /data:/data ubuntu bash
# ubuntu
docker run -it ubuntu bash
然后就可以当做ubuntu操作了.如果要推出bash,不是exit
,而要使用:
ctrl + p
然后再按
ctrl + q
如果再次进入的话,对于ubuntu的镜像,需要运行
docker attach container_id
或者
docker exec -ti container_id bash
外部登陆微系统
这个我就觉得很神奇了,相当于可以在原生系统里面可以使用多个的linux系统了,那么当时候给别人使用,也很方便的哈哈哈!
假设我讲外部的5561端口映射到容器的22端口(默认ssh端口),执行如下启动:
docker run -it -p 5561:22 ubuntu bash
启动了镜像之后,只需要在镜像容器内安装一个ssh服务
apt-get install openssh-server openssh-client
找到配置vim /etc/ssh/sshd_config
,将有PermitRootLogin
的注释了,然后增加一行:
PermitRootLogin yes
之后给root用户设定密码,之后就可以从外部登陆,假设我的真实的服务器的ip是:116.11.11.13,那么登陆服务器方式就应该是:
ssh -p 5561 root@116.11.11.13
就完全像登陆上了一台真实的服务器一样操作docker的镜像容器了.
三 常用命令
# 从仓库(默认拉取镜像)
git pull nginx
# 列出镜像
docker images
# 列出运行镜像的container
docker ps -a
# 删除运行中的container
docker rm container_id
# 删除镜像ubuntu/centos
docker image rm image_id / docker rmi image_id
# 启动并且运行docker
docker run --name container_name[容器名] -d[后台运行]
-p [服务器端口]:[虚拟端口] -v [服务器目录]:[虚拟机目录]
image_name[镜像名称]
# 切换到那个容器进行操控,exit退出
docker exec -it container_name[容器名] bash
# 停止,开始某容器的运行
docker start/stop container_name[容器名]
# 登陆docker
docker login
# 将本地的某一个镜像归入某个仓库
docker tag local_image[:tag] repository/image_name:tag
# 将运行的容器内的当前镜像打包生成新的镜像
docker commit -m "statement" -a "user statement" container_id repository/image_name:tag
四 docker部署nginx思路
先摆出这条命令,就清楚多了:
docker run -d -p 8765:80 --name nginx_server
-v /home/app/docker/nginx/html/:/usr/share/nginx/html/
-v /home/app/docker/nginx/conf/sites-enabled/:/etc/nginx/conf.d/
nginx
因为配置nginx主要是两个方面:1.项目的目录
,2.nginx的配置文件
,所以,为了方便,需要做映射,上面的每个参数-v
都是映射,将本机的目录映射到虚拟机内,而且每次修改文件要重新创建才起作用
,如果要进入虚拟机的脚本,运行命令docker exec nginx_server bash
就可进入交互页面.启动或者停止容器,只要用名子运行就可以了docker ngixn_server start/stop
五 dockerhub的push上云端
dockerhub
像github
一样,可以把自己的环境镜像推送上去保存.重点是,它保存的是镜像,就是软件运行的环境,而不是代码,只是环境
首先得有一个dockerhub的账号: docker镜像仓库链接.
之后,在命令行输入:
docker login
登录后,比如我的镜像是nginx,那么,我先制作标签
# docker tag image:tag [original image style] user_name/image:tag
# 作用是生成自己的版本,设定自己的仓库,以方便推,nginx的直接推是不行的,会得到deny回应
docker tag nginx [拉下来的默认是这个,没有tag] login_name/warehouse
之后推送镜像
docker push username/warehouse
就可以吧项目推送到dockerhub的仓库中供给到处使用了
经过实际的测试,我的ubuntu的docker镜像是18.04的,我的linux系统是16.04的,我在docker镜像里面安装了依赖和一些软件.当我push上dockerhub,然后,我在centos6.5拉下来,我的镜像无法运行,报错:
fatal:kernal too old
,就是核心组件太老,无法支持我的镜像了.在ubuntu16.04上拉下来之后,是可以正常使用的.
六 docker容器生成新镜像
docker commit -a "user statement" -m "statement" container_id repsitory/image_name:tag
七 little cookies
有的东西不好归类,在此处说明
- 给已经在容器里面run着的镜像添加端口
没看到有啥子方法能够补充添加的,能做的都只是要关闭容器,删除容器,重新run起来一个镜像,在run 的时候规定,如果容器里面安装了很多程序,可就麻烦了,只能转化一下思路了,思路就是:先把这个容器做成一个镜像,然后就保存了此个容器的状态在一个image中,然后,再重新运行这个image,顺便增加端口.删除原来的容器和镜像即可