目录
镜像和容器的关系
- 在Dokcer里面下载的是镜像,通过镜像运行起来容器,容器是我们实际使用的软件,镜像也可以比作是软件的安装包,可以通过安装包安装出多个软件。
- 类比java中类和对象的关系,一个类可以new出多个对象,那么一个镜像也可以创造出多个容器。
- 镜像 -> 类
- 容器 -> 对象
centOS安装Dokcer步骤
Docker安装命令
- 卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 省略详细步骤,在dokcer hub网站里面documention栏里可以查询到详细步骤,链接:官方安装文档
配置加速器
- linux中编辑docker配置文件
vi /etc/docker/daemon.json
- 执行命令生效
systemctl daemon-reload
systemctl restart docker
- 配置阿里云镜像加速器,每个阿里云账号都分配有一个自己的镜像加速器,可以自己申请账号查看
https://ictw0m8b.mirror.aliyuncs.com
下载镜像及Docker基本操作命令
1. 搜索镜像
docker search + 镜像名
例:搜索mysql的景象
docker search mysql
2. 拉取镜像
docker pull + 镜像名
例:拉取mysql的镜像,不写版本号的话,默认拉取latest版本镜像
docker pull mysql
出现以下提示说明拉取成功:
[root@iZwz91dz3gheaq5w2jih7tZ ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
c499e6d256d6: Pull complete
22c4cdf4ea75: Pull complete
6ff5091a5a30: Pull complete
2fd3d1af9403: Pull complete
0d9d26127d1d: Pull complete
54a67d4e7579: Pull complete
fe989230d866: Pull complete
3a808704d40c: Pull complete
826517d07519: Pull complete
69cd125db928: Pull complete
b5c43b8c2879: Pull complete
1811572b5ea5: Pull complete
Digest: sha256:b69d0b62d02ee1eba8c7aeb32eba1bb678b6cfa4ccfb211a5d7931c7755dc4a8
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
上例中下载了一个mysql作为实例,从下载过程中可以看到镜像分层存储的概念,下载也是一层层的去下载的,并不是单一文件。下载过程中给出了每一层的ID的前12位,下载结束后,会显示出该镜像完整的sha256的摘要,确保下载一致性。
3. 列出所有镜像
docker images
打印结果:
[root@iZwz91dz3gheaq5w2jih7tZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 9228ee8bac7a 10 days ago 547MB
hello-world latest fce289e99eb9 15 months ago 1.84kB
从左到右依次为仓库名,标签,镜像ID,创建时间,占用空间。
一个镜像可以对应多个标签,如果镜像id是相同的话,那么他们对应的就是同一个镜像。
显示占用的空间和docker hub上面可能是不同的,因为docker hub上面显示的是压缩前的大小,在下载后会解压,所以显示的就是占用本地磁盘的空间大小。另一方面,因为镜像文件是多层存储结构的,可以继承和复用,所以相同的软件,可能再次下载的大小就没有那么大,会复用已经下载好的镜像的结构。
4. 删除镜像
注:删除的镜像必须没有被容器所使用,否则会提示有容器正在使用,删除容器后即可删除镜像
docker image rmi +镜像id
5. 删除容器
注:容器必须处理停止状态才可以删除,否则会提示容器正在运行中,停止后即可删除
docker rm + 容器ID
运行Docker镜像
1. 运行镜像命令
docker run --name tomcat-8080 -p 8080:8080 -d tomcat
docker run + 镜像名称:tag 指运行哪个镜像
-d 表示后台运行该容器,不会在docker页面显示当前日志、操作等
–rm 表示容器在启动后,执行停止命令后,容器就自动销毁
–name 表示给容器起一个自定义名称,比如tomcat-8080,则在查看容器时会显示这个名称
-p 表示宿主机端口指向内部端口,例子表示docker内这个容器是8080,宿主机也是8080
2. 查看正在运行的容器
docker ps
3. 查看所有容器(包含运行中和退出)
docker ps -a
4. 停止容器
docker stop +容器id或者容器名称
5. 启动已终止的容器
docker start +容器id/容器名称
6. 进入容器内部
docker exec
例:
docker exec -it 容器ID或者容器名 bash
7. 宿主机和容器之间交换文件
- 从宿主机复制文件到容器
docker cp 文件名 容器名:地址
例:从宿主机复制xxx.jpg图片到tomcat容器内部ROOT文件夹内
docker cp xxx.jpg tomcat-8080:/usr/local/webapps/ROOT
- 从容器复制文件到宿主机
docker cp 容器名:地址 文件名 宿主机地址
例:
docker cp tomcat-8080:/usr/local/tomcat/webapps/ROOT/xxx.jpg /root
8. docker 查看log日志
docker logs 容器名称/容器ID
例:
docker logs -f -t --since="2018-12-1" --tail=10 qfjy_wxam
--since 此参数指定了输出日志开始日期
-f 查看实时日志
-t 查看日志产生的日期
-tail=10 查看最后10条日志
qfjy_name 容器名称
Docker 数据卷
通过镜像创建一个容器后,当容器被销毁后,容器内的数据将一并被删除,容器中的数据不是持久化的。
- 数据卷是一个可供一个或多个容器使用的特殊目录
- 数据卷可以在多个容器间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
1. 创建数据卷
docker volume create vol-test //test公共的文件夹资源静态资源
然后在root目录下创建一个文件夹,名叫“test”
- 查看所有数据卷
docker volume ls
将创建的数据卷复制到自定义文件夹里面
cp test /usr/local/docker/
例:创建容器的时候挂载test文件夹到Tomcat里面去,开启命令如下:
docker run --rm -d --name tomcat-8080 -p 8080:8080 -v /usr/local/docker/test/:/usr/local/tomcat/webapps/test tomcat
-v 数据卷参数
将宿主机/usr/local/docker/test/文件夹内的内容
挂载在容器/usr/local/tomcat/webapps/test 目录下
这时候,再在浏览器里面输入http://8.129.190.221:8080/test/3.jpg,那么这个test文件夹和里面的文件都是映射的docker文件夹里面的文件
3. 查看容器绑定或挂载的文件夹地址
docker inspect redis | grep Mounts -A 10
redis为容器名称,返回的信息:
"Mounts": [
{
"Type": "volume",
"Name": "f06e4ee059b5e78feb957b5d2fcefe7287309fa43cef4b431c22fbac5c178861",
"Source": "/var/lib/docker/volumes/f06e4ee059b5e78feb957b5d2fcefe7287309fa43cef4b431c22fbac5c178861/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
mysql安装步骤
1. 下载mysql
docker search mysql
docker pull mysql
2. 运行
docker run --privileged=true --restart always -p 3306:3306 --name mysql-3306 -v /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/conf.d/mysqld.cnf -v /usr/local/docker/mysql/logs:/logs -v /usr/local/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
--privileged=true 提升容器权限
--restart always 开机自启
-v /root/mysql/conf/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
-v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql
-d 代表后台运行
-- name 后面是给容器取得名字
最后面是镜像名称
3. 进入容器内部修改权限
docker exec it mysql-3306 bash
//先自测能否进入
mysql -uroot -p
4. 授权其他机器登录
- 授权主机登录
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
- 刷新权限
FLUSH PRIVILEGES;
- 退出
Exit
- 更改密码
//授权
GRANT ALL ON *.* TO 'root'@'%';
//更新加密规则:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
//更新root用户密码:
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Redis安装步骤
1. 基本运行命令
docker run -d --name redis-server -p 6379:6379 redis --requirepass “123456”
注:
–name redis-server : 指定容器名称
-p 6379:6379 : 端口映射
–requitepass “redis123” : 指定redis连接密码
2. 需要挂载及持久化运行命令
docker run -d --name redis -p 6379:6379 -v /usr/local/docker/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/redis/data/:/data redis:latest /etc/redis/redis.conf --appendonly yes --requirepass "12345678"
- 在/usr/redis新建文件夹,拷贝redis.conf配置文件,建data文件夹保存redis持久化数据
-v 挂在目录,这里分别挂载在redis.conf文件和data文件夹 - /etc/redis/redis.conf 关键配置,让redis以指定的配置文件启动,而不是默认无配置启动
–appendonly yes redis启动后开启数据持久化
//进入容器内部
docker exec -it redis-6679 bash
//进入redis客户端
redis-cli
//需要密码输入
auth password
注意: 如果本地不能连接Redis
- 检查阿里云有没有放行该端口号
- 检查linux服务器防火墙状态有没有放行该端口
- 配置redis.conf文件
默认配置:
bind 127.0.0.1
protected-mode yes
修改为:
# bind 127.0.0.1
protected-mode no
- 再重启Redis,Docker命令:
docker stop +容器名/容器id
docker start +容器名/容器id
Dockerfile 定制镜像
镜像的定制实际上就是定制每一层所添加的配置和文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本 ,用这个脚本来构建、定制镜像,那么无法重复的问题,镜像构建透明性的问题,体积的问题都会得到解决。
Dokcerfile是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
构建镜像
1. 在宿主机创建一个空白目录
mkdir -p /usr/local/docker/demo1
2. 在改目录下,创建文件Dockerfile
vim Dockerfile
内容为:
FROM tomcat
RUN echo 'Hello World'>/usr/local/tomcat/webapps/ROOT/index.html
docker build -t demo1 .
-t 指定要创建的目标镜像名称
虚悬镜像
虚悬镜像既没有仓库名,也没有标签,均为
这个镜像原本是有标签之类的,随着官方镜像维护,拉取新镜像后,旧的镜像就会被取代,就变成了虚悬镜像,可以随意删除,命令:
docker image prune
将war包部署到tomcat
1. docker文件夹下创建项目工程名称
mkdir -p /usr/local/docker/flower
cd /usr/local/docker/flower
2. 将桌面flower.zip复制到访问目录下
cp flower.zip /usr/local/docker/flower/
3. 创建镜像文件dockerfile,意思是在启动tomcat镜像的时候,会自动复制当前docker文件夹下面的war包到tomcat容器内,并解压、删除压缩包、部署
FROM tomcat #引入镜像
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN rm -rf
COPY flower.zip /usr/local/tomcat/webapps/ROOT #复制到ROOT下
RUN unzip flower.zip
RUN rm -f flower.zip
WORKDIR /usr/local/tomcat
4. dockerfile文件准备
FROM java:8
VOLUME /tmp
ADD spider.jar spider.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/exam.jar"]
- FROM: 表示基础镜像,即运行环境
- VOLUME/tmp: 创建/tmp目录并持久化到docker数据文件夹,因为springboot内嵌Tomcat 容器默认使用/tmp作为工作目录
- ADD: 拷贝文件并且重命名
EXPOSE: 并不是真正的发布端口,只是容器的端口,需要宿主机再映射
ENTRYPOINT: 容器启动时运行的命令,相当于我们在命令行中输入java -jar xxx.jar,为了缩短Tomcat的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为ENTRYPOINT
5. 进入dockerfile文件夹中
cd /usr/local/docker
[root@iZwz91dz3gheaq5w2jih7tZ ~]# cd /usr/local/docker/
[root@iZwz91dz3gheaq5w2jih7tZ docker]# ll
total 8
drwxr-xr-x 2 root root 4096 Apr 10 23:28 123
drwxr-xr-x 2 root root 4096 Apr 10 23:36 test
Idea集成docker实现镜像打包一键部署
1.docker开启远程访问
#修改该Dockerfile服务文件
vi /lib/systemd/system/docker.service
#修改execStart这行
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
#将以前那行注释掉就行了
#重新加载配置文件
systemctl daemon-reload
#重启服务
systemctl restart docker.service
#查看端口是否开启
netstat -nlpt
#直接curl看是否生效
curl http://127.0.0.1:2375/info
2. idea里面配置链接docker
3. 填入阿里云镜像加速器
在idea下方会有docker栏出现,在镜像中右键可以创建容器,在Run options里面可以填镜像创建的参数,-p 之类的
Dockerfile配置
1. 创建Dockerfile文件
Dokcerfile文本内容:
### 基础镜像,使用alpine操作系统,openjkd使用8u201
FROM java:8
#作者,可以不填
MAINTAINER Mouye <7021****@qq.com>
#系统编码
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
#声明一个挂载点,容器内此路径会对应宿主机的某个文件夹
VOLUME /tmp
#应用构建成功后的jar文件被复制到镜像内
#名字需要改成自己当前项目的名字
ADD target/flower.jar flower.jar
#启动容器时的进程,后面的flower.jar需要改成自己的包的名字
ENTRYPOINT ["java","-jar","/flower.jar"]
#暴露8080端口,也可以暴露别的端口
EXPOSE 8080
2. 创建配置
打开如图所示位置,
依次选择如图所示内容添加Docker配置
注意:
当运行在容器中的项目需要读取宿主机文件的时候,比如上传的图片的宿主机中,但是docker容器中是读不到的,所以这个时候可以-v挂载对应的文件夹,那么这样就可以读取了