Docker
资料来自
菜鸟教程
鲁班教程视频
狂神Docker
Docker命令
步骤
- docker可以在window上运行,win78和win10的安装方法还不一样,自行百度,这里是在centos虚拟机上使用的笔记
- 首先需要linux系统是centos-7以上
- 在linux下载docker
yum install -y yum-utils device-mapper-persistent-data lvm2
# 这是外国的,建议百度搜索国内的镜像
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 更新一下插件
yum makecache fast
# 下载安装
yum install docker-ce docker-ce-cli containerd.io
# 有选择都输入 y + 回车
docker version
- 启动docker
systemctl start docker
- 配置docker镜像下载源,不然下载镜像太慢
# 没有得自己创建
cd /etc/docker
# 没有得自己创建
vim daemon.json
# 添加上
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
# 如果买的是阿里的服务器一定要用阿里的镜像加速服务
# https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
# 重新加载配制
systemctl daemon-reload
# 重启服务
service docker restart
- 下载tomcat镜像
docker search tomcat
# 用最新的版本
docker pull tomcat
# 制定版本
docker pull tomcat:5.7
- 查看镜像
docker image ls
- 删除镜像
# 停止才能删
docker rmi -f 【id】
- 执行镜像,生成容器,并启动容器,不同程序的命令不一样
# -d 后台运行
# -p 开放端口
docker run --name -d -p 8080:8080 tomcat
# -dit 守护进程,因为如果没有外界使用这个服务,docker会自动关闭
# 这个只有一个容器是特例,比如centos,不是每个都这么用的
docker run --name -dit -p 8080:8080 tomcat
# 到这里访问外部的地址,就能看到内置的页面了
- 查看日记
# 查看最新的10条日志
docker logs -tf --tail 10 【id】
# 查看所有日志
docker logs -tf 【id】
- 查看容器
# 列出所有正在运行的容器
docker ps
# 列出所有的容器,包括没有运行的
docker ps -a
# 查看容器的运行端口
docker container port 【id】
# 查看容器的资源管理器
docker top 【id】
- 进入容器,退出容器
docker exec -it 【id】 /bin/bash
# 退出,这个退出是不会关闭容器的
exit
- 关闭容器,开启容器
# 停止容器
docker container stop 【id】
# 容器已经存在就不需要再次 run 命令去生成了
docker container start 【id】
# 停用全部运行中的容器
docker stop $(docker ps -q)
- 删除容器
# 必须先把容器停止了再删除
docker rm -f【id】
# 删除全部容器:
docker rm $(docker ps -aq)
- 一条命令实现停用并删除容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq)
从容器把文件取出来
# 用来把数据库等数据拷贝出来的操作
# 后面用文件挂载代替
# docker cp 【id】:/【容器路径】 /【外部路径】
docker cp t123w1:/usr/xxx.txt /usr
文件挂载
因为容器里的文件很难操作,所以需要把文件映射到linux的普通的文件夹里,正常需要被挂载的文件有日志文件,data数据,配置文件,映射的文件是双向绑定的,下面用mysql做例子
# 在外部创建文件夹
mkdir /opt
mkdir /opt/mysql
mkdir /opt/mysql/conf.d
mkdir /opt/mysql/data/
# 创建my.cnf配置文件
touch /opt/mysql/my.cnf
# my.cnf添加如下内容:
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
# 创建容器,并后台启动
docker run
-d -p 3306:3306 --name mysql
-v /opt/mysql/data/:/var/lib/mysql
-v /opt/mysql/conf.d:/etc/mysql/conf.d
-v /opt/mysql/my.cnf:/etc/mysql/my.cnf
-e MYSQL_ROOT_PASSWORD=123456
mysql
# 参数说明:
-d 后台运行
-p 开放端口
-v /opt/mysql/conf.d/my.cnf:/etc/my.cnf:映射配置文件
-v /opt/mysql/data/:/var/lib/mysql:映射数据目录
为什么要用docker
因为docker里的镜像和容器可以打包移动,可以那个u盘存起来,换虚拟机不麻烦,还能保证程序的版本和配置
- 导入导出镜像
- 导入导出容器,需要把容器停止
容器里的网络连接
# 在docker里默认有个网络,如果我们启动容器不传--network的参数就是默认使用这个网络,这个网络之间的通信非常的困难,所以需要自己创建一个
# 自定义网络,这个其实也是一个镜像,这个自定义的网络之间是可以相互通信的,比默认的更加自由
docker network create -d bridge test-net
# 重新启动
# 一般来说容器的相互连接很少,除了数据库集群,还有elk
docker run -itd --name nginx01 --network test-net nginx /bin/bash
docker run -itd --name nginx02 --network test-net nginx /bin/bash
# 如果连接了docker默认网络的容器想访问自定义网络的容器怎么办
# 用默认网络的容器名连接自定义网络
# 执行之后,【默认网络的容器名】就可以随意的和 nginx01,nginx02 通信了
docker network connect test-net 【默认网络的容器名】
为什么会有虚拟机的docker
- docker本身是运行在虚拟机系统上的
- 为什么有人会在docker里还安装虚拟机
- 因为安装了虚拟机的docker后,可以把这个docker卖给别人用
高端内容
- 自制镜像,dockerfile,原理是先把压缩包和依赖准备好,比如tomcat需要jdk,然后创建一个dockerfile的命令文件,这里面写的就是两个压缩包的使用命令,比如解压,配置环境变量等等,然后把文件执行一下,成功之后就可以得到一个镜像,这个镜像可以生成容器,也可以发布给别人使用
# FROM 指定基础镜像(FROM是必备的指令,并且必须为第一条指令)
# RUN 后面接要执行的命令
# ENV 命令主要用于设置容器运行时的环境变量
# ADD 主要用于将宿主机中的文件添加到镜像中
# EXPOSE: 暴露端口
mkdir nginx
cd nginx/
wget http://nginx.org/download/nginx-1.9.9.tar.gz
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.42.tar.gz
vim Dockerfile #必须大写
# 文件内容
FROM centos :默认从本地
MAINTAINER zi hao
ADD pcre-8.42.tar.gz /usr/local/src
ADD nginx-1.9.9.tar.gz /usr/local/src
RUN yum install -y wget gcc gcc-c++ make openssl-devel
RUN useradd -s /sbin/nologin -M www
WORKDIR /usr/local/src/nginx-1.9.9
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-pcre=/usr/local/src/pcre-8.42 && make && make install
RUN echo "daemon off;" >> /usr/local/nginx/nginx.conf
ENV PATH /usr/local/ngix/sbin:$PATH
EXPOSE 80
CMD ["nginx"]
# 保存退出
:wq!
# 执行
# 这个过程里找到dockerfile配置里的依赖本地没有就会自动去下载
docker build -t nginx:centos .
# 查看打包的镜像
docker image ls
# 使用
docker run -d -p 80:80 --name nginx nginx:centos
- dockerfile发布springcloud
# 先打包出两个image,一个是eureka:v1,另一个是order:v1
# 启动eureka:v1
docker run --name eureka -d -p 7001:7001 eureka:v1
# 启动order:v1,link连接eureka
docker service create --link eureka:v1 --replicas 1 --name order -p 9001:9001 order:v1
- docker-redis集群
docker pull redis
# 在路径/home下创建一个文件夹redis-cluster
# 在路径/home/redis-cluster下创建一个文件redis-cluster.tmpl
mkdir redis-cluster
cd redis-cluster
touch redis-cluster.tmpl
vim redis-cluster.tmpl
port ${PORT}
masterauth 123456 (设置集群节点间访问密码,跟下面一致)
requirepass 123456 (设置redis访问密码)
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.19.0.1
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
:wq!
# 循环生成
for port in `seq 7000 7005`; do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done
# 创建网络
docker network create redis-net
# 循环开启
for port in `seq 7000 7005`; do \
docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
-v /home/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /home/redis-cluster/${port}/data:/data \
--restart always --name redis-${port} --net redis-net \
--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done
# 随便进入一个
docker exec -it redis-7001 bash
redis-cli -a 123456
--cluster create 192.168.96.171:7001 192.168.96.171:7002
192.168.96.171:7003 192.168.96.171:7004 192.168.96.171:7005
192.168.96.171:7006 --cluster-replicas 1
# 使用
redis-cli -c -a 123456 -h 192.168.96.171 -p 7001
- dockor-compose,查看【Docker进阶】笔记
- dockor-swarm,查看【Docker进阶】笔记