docker

一、概述

Docker就是用来解决开发环境问题的,把开发环境打包,这样就可以在不同的服务器上进行移植。

但docker的作用不仅用作移植,可以更方便的部署项目。Docker compose常用来部署spring cloud。

关于使用docker的意义,这篇文章总结的很好。http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html

Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发 Docker 镜像。客户端和服务器可以运行在同一个 Host 上,当启动docker服务之后,就同时启动了client和server。如果client/server在不同机器上,客户端可以通过 Socket 或 REST API 与远程的服务器通信。

docker的架构图:(Client向Docker daemon发送命令,Docker daemon到Registry拉取镜像,在Docker daemon上建立容器)


Docker 的核心组件包括:
Docker Client:docker客户端发送命令到docker daemon,docker daemon根据相关的命令对容器执行运行、构建等操作。
Docker Daemon:相当于docker服务器,根据client的命令来创建、运行、监控容器,构建、存储镜像。默认配置下,Docker Daemon 只能响应来自本地(127.0.0.1) 主机的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听。
Docker Registry:存储 Docker Image 的仓库,运行 docker pull 时,实际上是client将命令发送给daemon,daemon负责到docker registry拉取镜像。可以搭建registry私服储存自己的镜像。

看下面的流程图:

Docker Image:镜像
Docker Container:容器,容器是根据镜像创建的。

关于image和container:从docker registry上拉取镜像到本地,在本地运行镜像时就是一个容器。image类似安装包一样,拉取image之后,保存在了本地(保存目录/var/docker/lib),运行image之后,开始占用内存,消耗资源,也就变成一个container。

二、安装

yum install docker    #yum安装
systemctl start docker    #启动服务

tip:docker基于c/s模式,上面的服务启动命令同时启动了client和daemon,并且默认daemon只接收本机client的命令。

修改镜像源地址

既然docker daemon需要到Registry拉取镜像,那么就需要添加国内镜像源了。

使用网易的镜像源,修改/etc/docker/daemon.json:

{
"registry-mirrors": ["http://hub-mirror.c.163.com"]  
}

修改完成后重启服务。

docker info命令可以查看当前docker daemon的信息,包括镜像数、容器数和主机信息等。如下可以看到配置的镜像:

docker-daemon接收远程命令

之前提到,默认情况下docker daemon只接收本机命令,即docker daemon使用Unix socket(/var/run/docker.sock)进行与本地client的通信,并且未监听任何端口。

如果要允许docker daemon接收远程命令,在/usr/lib/systemd/system/docker.service,ExecStart部分中添加:

# 注意换行符
-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375 \

-H 用来配置docker daemon的socket,接受三种形式:unix,tcp,fd,默认情况下只使用docker.sock通信,也就是本地通信,上面的配置在docker.sock的基础上添加了对2375端口的监听。

来稍微看下docker.service的内容:

上面的配置中,EnvironmentFile下是docker的一些配置文件,/etc/sysconfig/docker是基本配置文件,docker-storage是关于储存的,docker-network是关于网络的。

在老版本的docker中,如果要允许docker daemon接收远程通信,还可以修改/etc/default/docker,添加DOCKER_OPTS参数,修改后即可生效。但是在新版本的docker中,配置文件发生了改变,已经变成了上面的样子。上面可以看到EnvironmentFiles中是没有/etc/default/docker的,所以还要手动添加此文件,才能让docker daemon接受远程通信。

修改docker.service之后,执行以下命令:

systemctl daemon-relead    #重新读取服务配置文件
systemctl restart docker    #重启服务
netstat -at | grep 2375    #查看2375是否被监听

可以看到2375端口被监听。

三、使用

部分docker命令,更多命令docker --help查看。

docker search image_name #在hub中查询镜像
docker pull image_name    #拉取镜像
docker images    #查看所有已安装镜像
docker run image_name    #运行镜像
docker container ls    #显示正在运行的容器
docker ps    #同上
docker ps -a    #查看所有容器,包括未运行的
docker start container_name/container_id    #启动/重启/停止容器
docker restart container_name/container_id
docker stop container_name/container_id 
docker rm container_name/container_id    #删除容器

-hello-world镜像

docker pull library/hello-world    #拉取镜像
docker images    #查看镜像
docker run hello-world    #运行hello-world镜像

运行结果:

内容中有docker运行的流程,可以一看。

docker采用的是c/s模式,docker pull是客户端向docker-daemon发送的拉取命令,docker-daemon会在当前主机中寻找此镜像,如果没有则会到docker-hub中远程下载镜像,镜像保存目录为/var/lib/docker。docker run 运行命令,根据拉取的镜像创建一个容器。

-拉取nginx

docker pull nginx    #拉取镜像
docker run --name nginx_test -d -p 8080:80 nginx    
#-d后台运行,-p本地的8080端口映射到容器的80端口 --name容器名

tip:docker run命令中的'nginx'是指镜像名,如果镜像名中有tag,在命令中也记得加上。

进入容器内部,修改nginx配置文件。

docker exec -it nginx_test bash    #进入容器内部

进入之后相当于一个新的系统,可以找到nginx进行配置。要退出镜像,输入exit命令即可。

问题:进入容器之后发现没办法修改啊,因为没有vi,无法直接配置,所以需要将配置文件等挂载出来。

nginx容器中的配置文件挂载到宿主机,可以直接在宿主机中修改配置文件。

在挂载之前,需要将容器中的文件复制到宿主机内。

nginx文件位置:

默认html位置:/usr/share/nginx/html

配置文件位置:/etc/nginx/nginx.conf--------------nginx.conf引用了/etc/nginx/conf.d/*.conf

log位置:/var/log/nginx

拷贝容器内的文件到宿主机:

docker cp nginx_test:/usr/share/nginx/html /var/docker/nginx/    #直接复制文件夹
docker cp nginx_test:/etc/nginx/conf.d /var/docker/nginx/etc    #复制conf.d
docker cp nginx_test:/etc/nginx/nginx.conf /var/docker/nginx/etc     #复制nginx.conf
docker cp nginx_test:/var/log/nginx /var/docker/nginx/    #复制log

将上述文件挂载,具体命令:

docker -p 8080:80 -d --name nginx_test --privileged=true \
-v /var/docker/nginx/html:/usr/share/nginx/html \
-v /var/docker/nginx/log:/var/log/nginx \
-v /var/docker/nginx/conf.d:/etc/nginx/conf.d \
-v /var/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
nginx

这里有一个小坑:

如果在启动时不加--privileged=true参数,启动nginx容器会秒退,查看日志,报错为[permisson denied],宿主机权限不够:

-Oracle 11g

docker安装配置oracle

# 拉取oralce_11g镜像

docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g 

# 运行镜像

docker run -d -p 1521:1521 --name oracle_11g docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

#查看运行的镜像

docker ps 

# 运行容器

docker start oracle_11g

# 进入oracle_11g容器

docker exec -it oracle_11g bash

# 切换root用户,密码helowin

su root

# 修改环境变量,编辑/etc/profile

export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=helowin
export PATH=$ORACLE_HOME/bin:$PATH 
# 切换oracle用户

su oracle

sqlplus /nolog #不知道啥意思

sqlplus /as sysdba 不知道啥意思

# 修改system/sys用户密码为system/sys

alter user system identified by system

alter user sys identified by sys

# 以下不知道啥意思

alter profile default limit password_life_time unlimited
 

客户端连接oracle数据库

 

 

-Dockerfile

dockerfile是对镜像的描述文件,用来自定义镜像,通常是继承已有镜像,利用dockerfile来构建自己的镜像,运行镜像即可得到容器。

Dockerfile还是比较复杂,需要再开博文去系统总结,这里只以JDK8镜像作简单说明。

下面是JDK8的Dockerfile:

#基础镜像
FROM java:8

#维护者信息
MAINTAINER cui

#构建镜像时执行的命令
RUN echo "haha"

#运行容器时执行的命令
CMD java -version

构建镜像命令:

docker build dockerfile所在目录

 执行流程:

q

-打包docker镜像

以nginx为例,修改Nginx之后,可以将Nginx打包为新的镜像 ,再将新的镜像上传到docker cloud。

docker commit nginx_test nginx:v1.1    #打包修改的nginx容器为新的镜像

docker images查看镜像:

首先在docker hub注册:https://hub.docker.com/

docker login 登录:

docker tag为镜像重命名:

docker tag nginx cjoda1218/study:v1.1    #nginx为镜像名 用户名/仓库名:版本

上传:

docker push cjoda1218/study:v1.1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值