Docker使用

2018-03-06  本文已影响0人  某言

首先,了解了下,我直接把它看做虚拟机.

里面有两个概念imagecontainer,image可能相当于系统的镜像,比如win7之类的,而container相当于计算机,把镜像安装在计算机中,构成了一个独立的环境.

比如说我的linux是一个系统,它相当于运行在我linux上的一个虚拟机,项目,就运行在Docker这个虚拟机内,迁移的时候,或者部署的时候,只用动这个虚拟机就行了,里面有着成套的环境,非常方便.我甚至可以在docker的image内布置一个ubuntu系统,然后在其中跑各种环境.首先摆上两个网址供给参考:


一 基本操作

yum upgrade device-mapper-libs

之后执行下列命令来安装:

yum install -y docker-io

启动,停止,重启

servive docker start
servive docker stop
servive docker restart

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

# 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返回的内容了.


# 登陆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的虚拟机子而不使用我正常的环境了,避免出错得很!

  1. 首先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上云端

dockerhubgithub一样,可以把自己的环境镜像推送上去保存.重点是,它保存的是镜像,就是软件运行的环境,而不是代码,只是环境
首先得有一个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

有的东西不好归类,在此处说明

  1. 给已经在容器里面run着的镜像添加端口
    没看到有啥子方法能够补充添加的,能做的都只是要关闭容器,删除容器,重新run起来一个镜像,在run 的时候规定,如果容器里面安装了很多程序,可就麻烦了,只能转化一下思路了,思路就是:先把这个容器做成一个镜像,然后就保存了此个容器的状态在一个image中,然后,再重新运行这个image,顺便增加端口.删除原来的容器和镜像即可
上一篇下一篇

猜你喜欢

热点阅读