一、概述
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