一 、Docker架构
dockers加速镜像:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://z90yxq2m.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Ubuntu下:
sudo service docker start
查看dockers容器有哪些镜像:
docker images
docker images -q 查看所有镜像的id
删除所有镜像 docker rmi `docker images -q`
删除镜像 docker rmi --force 镜像ID
搜索有哪些镜像
docker search imagename
下载镜像到dockers容器
docker pull imagename
从容器中删除某个镜像
docker rmi redis:5.0
查看官网: https://hub.docker.com
1. 容器相关命令
-
查看容器
-
创建容器
-
进入容器
-
启动容器
-
停止容器
-
删除容器
-
查看容器信息
1.1 创建容器 docker run
docker images
-i 容器一直运行 -t 创建终端 -d 后台运行创建容器
1. 创建容器
方法一
docker run -it --name=lk centos:7 /bin/bash
注意 使用 -it参数创建的容器 创建完成立即进入容器,exit就会立马关闭容器
方法二
docker run -id --name=lk1 centos:7
2. 查看容器
docker ps -a
注意 使用 -id参数创建的容器 创建完成不会立即进入容器,exit也不会关闭容器还是后台运行
-it创建的容器一般称为交互式容器, -id创建的容器一般称其为守护式容器
3. 进入容器
docker exec -it lk /bin/bash
4. 停止容器
docker stop lk
5. 启动容器
docker start lk
6. 删除容器
docker rm lk
7. 删除所有容器
docker rm `docker ps -aq` 但是开启状态的容器是不能被删除的
8. 查看容器的信息
docker inspect lk
2. docker容器的数据卷
2.1 数据卷的概念与作用
思考:
- docker容器删除后,容器中产生的数据还在吗?
- docker容器和外部机器可以直接交换文件吗?
- docker容器之间想要进行数据交互
通过上面三个问题引入了:
容器的数据卷
-
数据卷是宿主机中的一个文件和目录
-
当容器目录和数据卷目录绑定后,双方的修改会立即同步
-
一个数据卷可以被多个容器同时挂载
-
一个容器也可以被挂载多个数据卷
数据卷的作用:
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
2.2配置数据卷
-
创建启动容器时,使用 -v 参数 设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录 注意事项: 1. 目录必须是绝对路径 2. 如果目录不存在, 会自动创建 3. 可挂载多个数据卷
2.3 配置数据卷容器
多容器进行数据交换
- 多个容器挂载同一个数据卷
- 数据卷容器
至少需要三个容器
配置数据卷容器的方法
1. 创建启动c3数据卷容器,使用-v参数设置数据卷
docker run -it --name=c3 -v /volume centos:7 /bin/bash
2. 创建启动c1 ,c2容器,使用--volumes-from参数 设置数据卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
3. docker应用部署
3.1 MySQL部署
- 容器内的网络服务和外部机器不能直接通信.外部机器和宿主机可以直接通信
- 宿主机和容器可以直接通信
- 当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的该端口,从而间接访问容器的服务。
- 这种操作称为:端口映射
安装部署
1. 搜索MySQL镜像
docker search mysql
2. 拉去mysql镜像
docker pull mysql:5.6
3. 在宿主机下创建容器,设置端口映射、目录映射
mkdir ~/mysql
cd mysql
docker run -id -p 3307: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.6
3.2 Tomcat 安装部署
1. 搜索tomcat镜像
docker search tomcat
2. 拉去tomcat镜像
docker pull tomcat
3. 在宿主机下创建容器,设置端口映射、目录映射
mkdir ~/tomcat
cd tomcat
docker run -id -p 8090:8080 --name=c_tomcat \
-v $PWD:/usr/local/tomcat/webapp \
tomcat
4. 外部机器访问tomcat
192.168.31.20:8090
3.3 Nginx部署
1. 搜索Nginx镜像
docker search Nginx
2. 拉去Nginx镜像
docker pull Nginx
3. 在宿主机下创建容器,设置端口映射、目录映射
mkdir ~/Nginx
cd Nginx
mkdir conf
cd conf
在~/nginx/conf目录下创建nginx.conf文件,
vim nginx.conf
docker run -id -p 80:80 --name=c_nginx \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
4. 外部机器访问tomcat
192.168.31.20:80
nginx.conf的内容是
user administrator root; #配置用户或者组,默认为nobody nobody。
worker_processes 2; #允许生成的进程数,默认为1
pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log /var/log/nginx/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
#accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
#multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include /etc/nginx/mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
#自定义格式
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; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
#tcp_nopush on;
#sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
#upstream mysvr {
# server 127.0.0.1:7878;
# server 192.168.10.121:3333 backup; #热备
#}
server {
#keepalive_requests 120; #单连接请求上限次数。
listen 80; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
#proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
#deny 127.0.0.1; #拒绝的ip
#allow 172.18.5.54; #允许的ip
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 404 /404.html; #错误页
# 将服务器错误页重定向到静态页 /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
include /etc/nginx/conf.d/*.conf;
}
3.4 Redis部署
1. 搜索Redis镜像
docker search Redis
2. 拉去tomcat镜像
docker pull Redis:5.0
3. 在宿主机下创建容器,设置端口映射、目录映射
mkdir ~/Redis
cd tomcat
docker run -id -p 6379:6379 --name=c_Redis \
Redis:5.0
4. 外部机器访问Redis
192.168.31.20:6379
3.5 gitlab部署
在/usr/local/docker/gitlab目录下创建一个docker-compose.yml文件
version: '3'
services:
gitlab:
image: 'twang2218/gitlab-ce-zh:9.4'
restart: always
hostname: '172.24.71.184'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://172.24.71.184:8080'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 8080
ports:
- '8080:8080'
- '8443:443'
- '2222:22'
volumes:
- /usr/local/docker/gitlab/config:/etc/gitlab
- /usr/local/docker/gitlab/data:/var/opt/gitlab
- /usr/local/docker/gitlab/logs:/var/log/gitlab
version: '3'
networks:
my_net:
driver: bridge
ipam:
config:
- subnet: 172.30.0.1/24
services:
gitlab:
image: 'gitlab/gitlab-ce:14.9.5-ce.0'
container_name: gitlab
hostname: 'gitlab.example.com'
restart: always
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://172.24.71.184:8080'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 8080
# 需要配置到 gitlab.rb 中的配置可以在这里配置,每个配置一行,注意缩进。
# 电子邮件配置:
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "xxxxxxx@qq.com"
gitlab_rails['smtp_password'] = "授权码,不是密码"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
# 这里的邮箱账号和上面保持一致
gitlab_rails['gitlab_email_from'] = '528746460@qq.com'
user['git_user_email']="528746460@qq.com"
# 配置外部redis
redis['enable']=false
gitlab_rails['redis_host']="127.0.0.1"
gitlab_rails['redis_port']=6379
gitlab_rails['redis_password']='password'
gitlab_rails['redis_database']=10
#配置外部postgresql
postgresql['enable'] = false
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'utf8'
gitlab_rails['db_host'] = '127.0.0.1'
gitlab_rails['db_port'] = '5432'
gitlab_rails['db_username'] = 'postgres'
gitlab_rails['db_password'] = 'postgres'
gitlab_rails['db_database'] = "postgres"
ports:
- '8080:8080'
- '8443:443'
- '2222:22'
volumes:
- /usr/local/docker/gitlab/config:/etc/gitlab
- /usr/local/docker/gitlab/data:/var/opt/gitlab
- /usr/local/docker/gitlab/logs:/var/log/gitlab
#- /home/ecs-user/docker/gitlab/public:/opt/gitlab/embedded/service/gitlab-rails/public
shm_size: '256m'
logging:
driver: "json-file"
options:
max-size: "2g"
max-file: "2"
networks:
my_net:
ipv4_address: 172.30.0.6
保存文件后执行下面命令
1. sudo docker-compose up -d
2. sudo docker ps
3. sudo docker logs -f 容器id
4. Dockerfile 制作镜像
如何将自己的项目给到别人,避免水土不服
操作系统组成部分:
- 进程调度子系统
- 进程通信子系统
- 内存管理子系统
- 设备管理子系统
- 文件管理子系统
- 网络通信子系统
- 作业控制子系统
Linux 文件系统由 bootfs 和 rootfs 两部分组成
- bootfs :包含 bootloader (引导加载程序)和 kernel (内核).
- rootfs : root 文件系统,包含的就是典型 Linux 系统中的/ dev ,
/ proc ,/ bin ,/ etc 等标准目录和文件 - 不同的 linux 发行版, bootfs 基本一样,而 rootfs 不同,如 ubuntu、centos 等
4.1 Docker 镜像原理
- docker 镜像是由特殊的文件系统叠加而成的
- 最低端是bootfs,并使用宿主机的bootfs 复用宿主机的bootfs
- 第二层root文件系统rootfs,称为base image
- 然后再往上可以叠加其他的镜像文件
- 统一文件系统( Union File System )技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的境像成为基心镜像。
- 当从一个镜像启动容器时, Docker 会在最顶层加载一个读写文件系统作为容器
思考:
1.Docker镜像本质是什么? 复用
- 是一个分层文件系统
2.Docker 中一个 centos 镜像为什么只有200MB,而一个 centos 操作系统的 iso 文件要几个个 G ?
- Centos 的 iso 镜像文件包含 bootfs 和 rootfs ,而 docker 的 centos 镜像复用操作系统的 bootfs ,只有 rootfs 和其他晚像层
3.Docker中一个 tomcat 境像为什么有500MB,而一个 tomcat 安装包只有70多 MB ?.
- 由于 docker 中镜像是分层的, tomcat 虽然只有70多 MB ,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的 tomcat 镜像大小500多 MB
4.2 镜像制作
- 容器转为镜像
docker commit 容器id 镜像名称:版本号
注意对于 有挂载的一些文件 使用docker commit 是不会转为镜像的
-
镜像文件转为压缩包传给别人使用
下面二选一:
1.docker save 镜像名字:版本号 > 要打包的名字.tar
docker save 镜像名字:版本号 > 要打包的名字.tgz2.docker save -o 要打包名字.tar 镜像名字:版本号
-
压缩文件还原成镜像
下面二选一:
1.docker load -i 压缩文件名称
2.docker load < 已打包的镜像名字.tar/tgz
4.3 dockerfile实现镜像步骤
案例一:
- 定义父镜像: FROM java :8
- 定义作者信息: MAINTAINER itheima itheima@itcast.cn
- 将 jar 包添加到容器: ADD springboot.jar app.jar
- 定义容器启动执行的命令: CMD java -jar app . jar
执行dockerfile文件
在对应目录下将你的项目jar包发给对应的人员
在创建一个dockerfile
通过 dockerfile 构建镜像: docker bulid - f dockerfile 文件路径﹣ t 镜像名称版本
docker bulid -f ./dockerfile_1 -t websapp .
案例二:
案例:实现步骤
- 定义父镜像: FROM centos :7
- 定义作者信息: MAINTAINER itheima itheima@itcast.cn
- 执行安装 vim 命令: RUN yum install - y vim
- 定义默认的工作目录: WORKDIR / usr
- 定义容器启动执行的命令: CMD / bin / bash
使用dockerfile文件创建镜像,执行下面命令
docker bulid -f ./dockerfile_1 -t centos_hsh:1.0.2 .
5. docker compose
是一个编排容器分布式部署的工具
- 利用dockerfile定义运行环境镜像
- 使用docker-compose.xml定义组成应用的各服务
- 运行docker-compose up 启动应用
6. 私有仓库
docker pull registry
id - f dockerfile 文件路径﹣ t 镜像名称版本
docker bulid -f ./dockerfile_1 -t websapp .
案例二:
案例:实现步骤
- 定义父镜像: FROM centos :7
- 定义作者信息: MAINTAINER itheima itheima@itcast.cn
- 执行安装 vim 命令: RUN yum install - y vim
- 定义默认的工作目录: WORKDIR / usr
- 定义容器启动执行的命令: CMD / bin / bash
使用dockerfile文件创建镜像,执行下面命令
docker bulid -f ./dockerfile_1 -t centos_hsh:1.0.2 .
5. docker compose
是一个编排容器分布式部署的工具
- 利用dockerfile定义运行环境镜像
- 使用docker-compose.xml定义组成应用的各服务
- 运行docker-compose up 启动应用
6. 私有仓库
docker pull registry