docker
容器化部署应用能够简化应用的部署流程,假设部署一个应用须要在机器上安装和配置nginx
、tomcat
,若是须要新增一台服务器,或者切换服务器,那么就要重复一样的操做,安装nginx
、tomcat
并配置。容器化部署就是一次配置处处使用,将安装nginx
配置nginx
这一系列工做制做成一个镜像,在服务器上经过docker
拉取镜像并启动容器便可,以此实现集群自动伸缩。java
docker
入门简单,用好难,特别是制做镜像。随便作一个镜像就是1g
大小,这该怎么用。若是每次部署都要拉1g
的镜像,想一想均可怕。若是在Dockerfile
中使用yum
安装一些软件,build
的时间会很长,加上镜像太大,传输也耗时。应尽可能使用安装包安装替换yum
安装,以及使用尽可能小的基础镜像。mysql
使用Dockerfile
构建镜像,咱们能够理解为,docker
基于Dockerfiler
中的FROM
基础镜像,启动了一个容器,而后在容器中执行Dockerfile
中定义的脚本,执行完成后再打包成镜像。linux
docker
的镜像是分层的,你能够先定制一个基础镜像,再经过基础镜像去实现差别化定制。好比部署一个java
项目,每台机制都须要jdk
,但并非每台机器都须要安装nginx
,那么就能够先制做一个jdk
基础镜像。固然,制做jdk
基础镜像也是基于更底层的基础镜像,好比centos
。而后再基于jdk
基础镜像制做nginx
镜像,再制做应用镜像。制做应用镜像若是须要用到nginx
就能够基于nginx
镜像,不须要依赖nginx
就能够直接基于jdk
镜像。nginx
docker
的命令不须要记,动动手去试一试就记住了,记不住可使用docker -help
查看命令。新版本docker
将命令规范了,如docker image
是镜像相关的,docker container
是容器相关的,一样,也可使用docker container -help
来查看命令帮助。redis
学习doker
除了镜像制做以外,还须要理解这三点:端口映射、网络模式、容器卷(volume
)。sql
将宿主机端口映射到容器的端口,外部经过访问宿主机端口从而访问容器内应用。如容器中redis使用的端口是6379
,能够将宿主机的10880
端口与容器的6379
端口映射,外部经过宿主机ip
和10880
端口访问容器中的redis
。docker
### 使用镜像运行容器
### -p 10880:6379 将宿主机10880端口映射到容器6379端口
[root@wujiuye01 redis-app]# docker container run -itd --name simple-redis \
-p 10880:6379 wujiuye/simple-redis:5.0.7
05676da445839b1f4a1995148b4656d029721503a16d67edad37956fe7ea9f3a
### 宿主机访问容器中的redis
[root@wujiuye01 redis-app]# /root/redis/redis-5.0.5/src/redis-cli -p 10880
127.0.0.1:10880>
复制代码
docker
支持5
种网络模式,这里不作详细分析,由于我不是很了解。在启动容器时,能够指定使用哪一种网络模式:docker container run --network [网络模式]
。shell
bridge
: 默认使用,docket
启动后默认建立一个docker0
网桥,默认建立的容器也是添加到这个网桥中。host
: 容器不会得到一个独立的network namespace
,而是与宿主机共用一个。volume
)应用部署在一台服务器上运行会产生日记,不能随着容器的删除而致使日记被删除,因此须要将容器中的工做目录与宿主机的目录映射。或者说mysql
容器,容器移除而数据库文件不能删除。docker
为咱们提供了三种不一样的方式将目录从宿主机挂载到容器中:volume
、bind mount
、tmpfs
。数据库
docker
管理宿主文件系统的一部分(/var/lib/docker/volumes/容器id
)centos
docker volume create test-vol
docker volume inspect test-vol
docker container run -itd --name test --mount src=test-vol,dst=/data/apps/test wujiuye/test:1.0.0
--mount src=test-vol,dst=/data/apps/test
: 将容器卷挂载到容器的/data/apps/test
目录。
将文件放到容器的/data/apps/test
目录下,能够在宿主机的/var/lib/docker/volumes/test-vol
目录看到,反过来也是同样的。若是不指定--mount
,默认也是使用volumes
,而且容器卷的名称就是容器id
,也是在/var/lib/docker/volume/
目录下。
### 建立容器卷
[root@wujiuye01 docker]# docker volume create test-vol
test-vol
### 查看容器卷信息
[root@wujiuye01 docker]# docker volume inspect test-vol
[
{
"CreatedAt": "2020-01-04T17:57:08+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
"Name": "test-vol",
"Options": {},
"Scope": "local"
}
]
### 将容器卷挂载到容器
[root@wujiuye01 docker]# docker container run -itd --name test \
--mount src=test-vol,dst=/data/apps/test wujiuye/test:1.0.0
复制代码
能够存储在宿主机系统的任意目录,宿主机的目录必须存在。若是宿主机新增磁盘是挂载在/data
目录的,建议使用这种。如使用aws
的ec2
实例。
docker container run -itd --name test --mount type=bind,src=宿主机目录,dst=容器目录 wujiuye/test:1.0.0
复制代码
将指定的宿主机目录挂载到容器的指定目录。将文件放到<容器指定目录>
下,能够在<宿主机指定目录>
看到,反过来也是同样的。
挂载存储在宿主机系统的内存中,不会写入宿主机的文件系统
# 较旧的 Docker 版本称为 docker 或 docker-engine 。若是已安装这些程序,请卸载它们以及相关的依赖项。
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装所需的软件包。yum-utils 提供了 yum-config-manager ,而且 device mapper 存储驱动程序须要 device-mapper-persistent-data 和 lvm2
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 设置稳定的仓库。
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装最新版本的 Docker Engine-Community 和 containerd
sudo yum install docker-ce docker-ce-cli containerd.io
复制代码
## 中止
sudo systemctl stop docker
## 启动
sudo systemctl start docker
复制代码
准备redis
安装包和配置文件,新建一个Dockerfile
文件,目录结构以下:
-rw-r--r-- 1 root root 583 Jan 4 18:56 Dockerfile
-rw-r--r-- 1 root root 1984203 Jan 4 18:52 redis-5.0.7.tar.gz
-rw-r--r-- 1 root root 61797 Jan 4 18:52 redis.conf
复制代码
编写Dockerfile
文件,基于centos:7
镜像
FROM centos:7
MAINTAINER wujiuye <postmaster@wujiuye.com>
# 使用ps 命令 : ps -ef|grep redis
RUN yum install -y procps
# redis安装包和配置文件
ADD redis-5.0.7.tar.gz /usr/local/redis/
COPY redis.conf /usr/local/redis/local-redis.conf
# 安装gcc
RUN yum install gcc -y
# 安装make
RUN yum install make -y
# 编译redis
RUN cd /usr/local/redis/redis-5.0.7 && \
make
RUN yum clean all
EXPOSE 6379
# 启动redis
ENTRYPOINT /usr/local/redis/redis-5.0.7/src/redis-server
CMD ["/usr/local/redis/local-redis.conf"]
复制代码
COPY
、ADD
命令的src
只能使用相对路径,须要将文件拷贝到Dockerfile
的同级目录下redis
安装包与redis
配置文件COPY
或ADD
到容器的挂载目录下,不然因宿主机的源目录下没有这些文件,容器启动起来就找不到这些文件。构建镜像时将文件放在容器的/data/apps/
目录下,而启动容器时配置宿主机目录挂载到容器的/data/apps/
,docker
会将镜像中原有的/data/apps/
目录移除,才能够挂载。RUM
运行多条命令可以使用&&
符号链接,也能够写多个RUN
### 目录下的文件
[root@wujiuye01 redis-app]# ls
Dockerfile redis-5.0.7.tar.gz redis.conf
### 构建镜像
[root@wujiuye01 redis-app]# docker image build --tag wujiuye/simple-redis:5.0.7 .
....
Successfully built 2aab79854763
Successfully tagged wujiuye/simple-redis:5.0.7
复制代码
--tag
打标签,最后的.
是Dockerfile
文件所在的位置。
docker container run \
--rm -itd \
--ulimit nofile=102400:102400 \
--name=simple-redis \
-p 10880:6379 \ # 可写多个
--mount type=bind,src=/data/redis-app/,dst=/usr/local/redis \
wujiuye/simple-redis:5.0.7
复制代码
--rm
: 若是容器存在则删除,只是移除容器,正在运行的容器不会中止--name=simple-redis
: 给容器取一个名字-itd
: -i
、-t
、-d
的结合--ulimit nofile=102400:102400
设置ulimit
-p 10880:6379
宿主机与容器的端口映射--mount type=bind,src=...,dst=...
文件系统为mount bind
,src
为宿主机的目录,dst
为容器的目录[root@wujiuye01 redis-app]# docker container ls
### 容器id 使用的镜像 容器执行的命令 建立时间 容器状态 端口信息 容器名称
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05676da44583 wujiuye/simple-redis:5.0.7 "/bin/sh -c /usr/loc…" 6 minutes ago Up 6 minutes 0.0.0.0:10880->6379/tcp simple-redis
复制代码
在测试完镜像可用以后,能够选择push到远程仓库,也可本身搭建一个镜像仓库。
hub.docker.com
帐号,id
不要随便填写,如:wujiuye
wujiuye/simple-redis
docker tag local/test-redis:1.0.5 wujiuye/simple-redis:5.0.7
。本地镜像与远程仓库镜像标签不一样时使用。docker login
输入用户名密码登录docker push wujiuye/simple-redis:5.0.7
推送镜像至远程仓库[root@wujiuye01 redis-app]# docker push wujiuye/simple-redis:5.0.7
The push refers to repository [docker.io/wujiuye/simple-redis]
dafbadcc43aa: Pushing [==> ] 1.281MB/23.62MB
879a0e8874ba: Pushing [=============================> ] 66.96MB/111.8MB
ccc522a455bc: Pushing [> ] 549.9kB/100.2MB
879a0e8874ba: Pushing [================================> ] 73.04MB/111.8MB
ccc522a455bc: Pushing [> ] 1.107MB/100.2MB
ff7b8add839d: Pushing [=================> ] 51.75MB/146.8MB
dca066a10cae: Pushing [> ] 557.1kB/100.8MB
77b174a6a187: Waiting
复制代码
容器中止
1)、docker kill [容器名]
可选参数:
--signal: 发送信号量
2)、docker stop []
复制代码
删除容器和镜像
docker rmi $(docker images -q)
1)、先中止全部容器:docker stop $(docker ps -a -q)
2)、删除全部容器:docker rm $(docker ps -a -q)
复制代码
移除某个镜像:
1)、docker image rm [repository,如:wujiuye/simple-redis:5.0.7]
2)、docker image rm [镜像id]
复制代码
移除某个容器:
docker container rm [容器名称 或 容器id]
复制代码