一、docker服务常见命令
安装docker
yum -y install docker
1.查看docker版本
命令: docker -v
2.启动docker
命令: systemctl start docker
3.关闭docker
命令: systemctl stop docker
4.看到docker运行状态
命令: systemctl status docker (此时我已经开启了docker)
因为开启了docker 所以会出现红框中 active running
5.重启docker
命令:systemctl restart docker
6.开机启动docker
命令:systemctl enable docker
总结:
二、docker镜像相关命令
1.查看本地镜像
命令: docker images
这里新装的docker 本地没有镜像 所有只有表头
2.搜索远程镜像
例如我们需要redis镜像,首先我们去查询一下是否有redis镜像
命令:docker search redis
![image.png](https://upload-images.jianshu.io/upload_images/11123638-b4f83f8ce2f8b20c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
3.拉取远程镜像
命令:docker pull redis:5.0 (名称 :版本号)
这里(redis:5.0) :号后的为版本号,如果不写默认为最新 latest
下载完成后,再查看本地镜像,redis 5.0 已经下载到本地
这里注意:版本号不能乱写,我们需要到 hub.docker.com 网址查找对应的软件版本号,这里以redis为例子。
这里看到 5.0 tag版本号是有的,不是乱写的。
4.删除本地镜像
本地已有镜像
删除指定镜像 命令: docker rmi 镜像ID
docker rmi 5a3c8e192943
注意:假如两个镜像的ID一样,删除命令可以用 docker rmi REPOSITORY:TAG
遇到如下错误,就可以使用这种方法:
了解:删除所有的镜像
总结:
docker容器相关命令
容器由镜像来产生,就好比镜像是一个类,容器就是实例。
1.查看容器、创建容器、进入容器
参数含义:
-i :一直保持运行,就是说客户端没有连接该容器,该容器也会一直保持运行。
-t :一个终端,可以进入容器输入一些命令 ,可以和i 连着写-it
--name :给这个容器取一个名字
镜像名:版本号 :以哪一个镜像创建容器
/bin/bash :进入容器的一个初始化值
命令: docker run -it --name=c1 镜像名:版本号 /bin/bash
表示已经进入容器。@后就是容器的ID
查看容器里面的内容:
退出容器:exit
查看docker 里面有哪些运行的容器:
命令: docker ps
注意:这里只有表头,但是我们刚才 运行了一个redis容器为什么没有,应为用 -it 这个命令创建运行的容器,在exit执行以后,该容器会关闭。
命令: docker ps -a 关闭和没关闭的容器都可以看到
第一种创建容器的特点:(终端)
1创建以后立马进入该容器 2 exit执行以后,会关闭该容器
第二种创建容器
参数:d 后台运行该容器。
特点:后台运行。1创建以后不会立马进入容器,需要执行命令才会进入该容器。2exit执行以后,不会自动关闭该容器。
命令:docker run -id --name=c2 redis:5.0
此时没有进入容器 执行 docker exec -it 容器名字 /bin/bash
退出容器,但是不关闭容器,容器依旧运行着
总结:
4.启动容器
先查看容器运行的状态,c2状态为关闭,执行 docker start 容器名
c2容器已经启动
5.停止容器
先查看容器运行的状态
执行停止命令: docker stop 容器名
此时c2容器已经关闭,状态已经为exited
6.删除容器
注意:容器停掉以后,才能删除容器
命令: docker rm 容器名 (以r1容器为例)
此时 r1已经被删除
根据所有的容器id删除所有容器(如果出错,请先关闭正在运行的容器)
docker rm
docker ps -aq
7.查看容器信息
命令: docker ps -aq 查看所有容器的id
命令:docker inspect 容器名 查看容器的信息
小结:
三、docker容器的数据卷
1.数据卷 简单理解为一个文件或者目录
2.配置数据卷
注意:~相当于 root ,宿主机中 可以写~或者/root ,容器中必须写为/root
命令:docker run -it --name=r1 -v ~/data:/root/data_container 镜像名:版本号
在宿主机上:/root/data 下创建了一个hhb.txt
在容器里面/root/data_container 也有hhb.txt文件
删掉了容器,宿主机/root/data 下依然还有hhb.txt。
docker数据卷容器
命令:docker run -it --name=c3 -v /volume redis:5.0 创建一个数据卷容器
命令:查看创建的c3容器的信息 docker inspect c3
这是我们创建两个容器c1 c2 挂载到c3 容器上,如下都会有一个volume目录
命令:docker run -it --name=c1 --volumes-from c3 redis:5.0 /bin/bash
命令:docker run -it --name=c2 --volumes-from c3 redis:5.0 /bin/bash
在c2容器 volume目录下创建了一个test.txt文件
我们去c1容器 volume目录下查看是否有test.txt文件
数据卷小结:
四、docker应用部署
MySql部署
在docker容器中部署Mysql,然后通过外部MySql客户端去操作mysql。
1.搜索镜像
docker search mysql
2.拉取Mysql镜像
docker pull mysql:5.7
3.创建容器
docker run -id \
-p 3306:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
执行:
进入到mysql容器内部:
docker exec -it c_mysql /bin/bash
登录mysql
mysql -uroot -p123456
3.操作容器中的MySql
我们随意创建一个数据库docker:
现在我们使用本机的mysql客户端去连接:
如果连接失败:
在虚拟机中执行:vim /usr/lib/sysctl.d/00-system.conf,在末尾添加net.ipv4.ip_forward=1
然后重启network服务: systemctl restart network
重启docker的mysql容器后就可以连接成功。
在客户端 建user表插入两条数据
在docker中mysql查看数据
tomcat部署
1.搜索tomcat镜像
docker search tomcat
2.拉取tomcat镜像(没有指定版本号,默认下载是最新的)
docker pull tomcat
3.创建容器
4.部署项目
外部机器访问tomcat
把打包的项目放在 /root/tomcat 目录下,如果访问失败,重启docker容器。
Nginx部署
1.搜索Nginx镜像
docker search nginx
2.拉取Nginx镜像
docker pull nginx
3.创建容器
首先我们需要创建一些目录
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65 ;
include /etc/nginx/conf.d/*.conf;
}
然后退出到nginx目录下:
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
在html目录下创建index.html页面
4.测试访问
启动 nginx 容器
Redis部署
1.搜索Redis镜像
docker search redis
2.拉取Redis镜像
docker pull redis:5.0
3.创建容器,设置端口映射
docker run -id --name=c_redis -p 6379:6379 redis:5.0
redis容器已经启动:
4.测试访问
使用外部机器连接redis
在redis-cli.exe文件当前目录下,cmd,执行一下命令:
redis-cli.exe -h reids服务器的ip地址 -p reids服务器的端口号
此时已经连接上我们部署的redis服务器。我们可以进行一些简单的操作。
五、Dockerfile (用来制造docker镜像)
1.Docker 镜像原理
总结:
1.bootfs相当于系统的内核,而我们创建启动docker需要依赖操作系统,所以直接复用宿主机的内核,不用在加载,docker和宿主机的内核共用一个,所以docker启动会很快。
2.在内核上我们可以叠加许多rootfs基础镜像,以及其他镜像 比如这里 jdk,tomcat镜像。当我们去下载tomcat镜像时,会查询所需要的镜像是否已经下载,如果没有,就需要下载所需要的镜像,这里rootfs基础镜像以及 jdk镜像。所以我们只下载tomcat镜像时,却会下载几百M的数据(rootfs基础镜像+ jdk镜像)。
3.当我们去下载ngnix镜像时,他需要去下载rootfs基础镜像,此时我们已经下载过tomcat镜像,rootfs基础镜像已经被下载加载过了,就不需要再次下载rootfs基础镜像,达到了一个复用的作用。
4.只读镜像,这些镜像不可以修改,修改了别人就不能复用了。
2.Dockerfile 概念及作用
Docker 镜像如何制作?
一、第一种
1.容器转为镜像
命令:docker commit 容器id 新的镜像名称:版本号
镜像不可以传输给别人,但是可以变成压缩文件传给别人。当我们一个容器(tomcat)部署了一个项目时,我们直接变成压缩文件给测试人员,测试人员把压缩文件转为镜像,可以直接拿来测试,不需要再次部署项目。
2.镜像转为压缩文件
o表示 output
命令:docker save -o 压缩文件名称 镜像名称:版本号
3.压缩文件转换为另一个镜像
i代表:intput
命令:docker load -i 压缩文件名称
注意:
通过这种方式挂载的目录文件会丢失,不是挂载目录下文件不会丢失。
二、第二种 dockerfile
查看别人的dockerfile是怎么写的找到对应的版本直接点进去:以mysql5.7为例
https://github.com/docker-library/mysql/blob/ee33a2144a0effe9459abf02f20a6202ae645e94/5.7/Dockerfile.debian
3.Dockerfile 关键字语法
Dochub网址: https://hub.docker.com
4.案例
第一个案例:
自定义一个centos7镜像,要求:
1.默认登录路径为/usr
2.可以使用vim
实现步骤:
(1)定义父镜像:FROM centos:7
(2)定义作者信息:MAINTAINER hhb hhb@it.cn
(3)执行安装vim命令:RUN yum install -y vim
(4)定义默认的工作目录:WORKDIR /usr
(5)定义容器启动执行的命令:CMD /bin/bash
创建dockerfile文件:
执行vim centos_dockerfile后输入:
FROM centos:7
MAINTAINER hhb <hhb@it.cn>
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
创建好centos_dockerfile文件后,使用build命令构建镜像:
最后的 . 代表寻找路径
命令:docker build -f dockerfile文件路径 -t 新镜像的名称:版本 .
正常方法使用自己创建的镜像就行。
第二个案例:
步骤:
部署soringboot项目:
自己创建一个springboot项目,打包成jar包
测试jar包是否有问题:
正常运行,说明打包的jar没有问题。
把jar包放在linux系统的root目录下:
把jar包放在docker-files目录下,准备添加到我们自己创建的dockerfile中,然后创建镜像:
执行vim springboot_dockerfile后输入下面代码:
FROM java:8 #定义父镜像
MAINTAINER hhb <hhb@it.cn> #定义作者信息
ADD docker-0.0.1-SNAPSHOT.jar app.jar #将jar包添加到容器
CMD java -jar app.jar #定义容器启动执行的命令
通过dockerfile构建镜像: docker build -f dockerfile文件路径 -t 镜像名称:版本
最后通过镜像创建容器:
测试我们的app镜像时候能访问到springboot项目:
五、Docker 服务编排
Docker Compose服务编排工具:
1.安装docker compose
在安装compose之前,需要先安装docker,我们以编译好的二进制方式安装在Linux系统中
curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
查看版本信息
docker-compose -version
2.卸载docker compose
二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
3.使用docker compose编排ngnix+springboot项目
(1)创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
(2)编写docker-compose.yml文件 (文件必须为这个名字)
执行 vim docker-compose.yml 命令后输入下面内容:
version: '3'
services:
ngnix:
image: nginx
ports:
- 80: 80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
含义解释:
version: '3' //版本号
services: //我们要创建启动哪些容器
ngnix: //容器1
image: nginx //通过哪个镜像启动,这里是nginx镜像,后面没有写版本号,为latest
ports: //端口映射
- 80:80 //宿主机80端口映射到容器80端口, ‘-’ 这个符号代表数组的意思
links: //当前项目可以访问到的其他项目
- app //对应app项目
volumes: //目录挂载,也就是数据卷
- ./nginx/conf.d:/etc/nginx/conf.d //宿主机./nginx/conf.d挂载到容器/etc/nginx/conf.d
app: //容器2
image: app //app镜像我已经在前面创建过了,包含了一个springboot项目
expose: //对外暴露的端口
- "8080"
(3)创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
(4)在./nginx/conf.d目录下编写hhb.conf文件
listen 80; 监听的端口
access_log off; 日志关闭
location / {
proxy_pass http://app:8080; //反向代理到的路径
}
server{
listen 80;
access_log off;
location / {
proxy_pass http://app:8080;
}
}
(5)退出到docker-compose.yml文件所在的目录后,直接启动
在浏览器中访问linux系统ip地址:80端口
访问http://192.168.0.105/hello这里hello是我在springboot项目中中写的一个controller,然后返回的hello my dockerfile这段文字。
六、Docker 私有仓库
1.搭建私有仓库
当我们的服务器无法访问互联网,或者不想把我们的镜像上传到公网上,就可以搭建一个私有仓库
(1)拉取私有仓库镜像
docker pull registry
(2)启动私有仓库
docker run -id --name=registry -p 5000:5000 registry
(3)打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
(4)修改daemon.json
追加下面内容阿里镜像加速器
vim /etc/docker/daemon.json
在上述文件中国添加一个key,保存退出。此步用于让docker 信任私有仓库地址;注意私有仓库服务器ip修改为自己私有仓库服务器真是ip
{"insecure-registries": ["私有仓库服务器ip:5000"]}
(5)重启docker 服务
systemctl restart docker
执行测试:
这里私有仓库已搭建成功,要让我们的私有仓库能用,必须让docker信任我们的私有仓库。
2.上传镜像到私有仓库
(1)标记镜像为私有仓库的镜像
docker tag centos:7 私有仓库服务器ip:5000/centos:7
(2)上传标记的镜像
注意:1删除标记的镜像使用镜像的名称来删除,使用id的话,会发现被标记的镜像和生成的标记镜像id相同 2记得启动创建的registry私有仓库容器,不然上传会报错,连接拒绝。
docker push 私有仓库服务器ip:5000/centos:7
3.从私有仓库拉取镜像
方便测试,我们先删除生成的标记对象
拉取命令:
docker pull 私有仓库镜像名称:版本号