这个博客非常好,里面有docker相关的内容 docker - 洛溪 (zhpengfei.com)
安装docker
使用官方安装脚本自动安装
安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
也可以使用国内 daocloud 一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
安装完成后,如果允许docker命令,如docker ps
,若出现报错
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
如果是CentOS或者Ubuntu您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xcsq9xqy.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker命令
docker服务相关命令
启动 Docker服务
systemctl start docker
停止docker服务
systemctl stop docker
查看docker服务状态
systemctl status docker
重启docker服务
systemctl restart docker
设置开机启动docker服务
systemctl enable docker
docker镜像相关命令
查看镜像
docker images
docker images -q #查看所有镜像Id
搜索镜像
docker search xx
下载镜像
docker pull xx
docker pull xx:版本号
删除镜像
docker rmi xx:版本号
docker容器相关命令
查看容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器,关闭和没关闭的都可以看到
docker ps -aq #查看所有容器id
创建容器
docker run -it --name=c1 centos:7 /bin/bash
docker run -id --name=c2 centos:7
-
-i: 交互式操作,没有连接也一直运行
-
-t: 给容器分配终端。
-
-d:后台运行容器
-
–name:容器名字
-
ubuntu: ubuntu 镜像。
-
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash,不加默认/bin/bash。
进入容器
docker exec -it c2 /bin/bash
停止容器
docker stop c2
启动容器
docker start c2
查看容器信息
docker inspect c2
删除容器
docker stop c2
docker rm c2
docker rm `docker ps -aq`
docker容器的数据卷
数据卷概念
配置数据卷
数据卷容器
解决的场景
注意:即使挂载的同一个数据卷容器c3挂了,c1和c2的数据交换不受影响;如果c1、c2数据变化了,c3后面起来了,c3的数据和c1、c2一样。
数据卷小结
数据卷实质就是宿主机的一个目录或文件,这个目录或文件得跟容器的一个目录或文件通过-v参数来进行映射
容器数据持久化:容器里面的数据产生了,如果容器出现问题,将来数据不能再恢复了,绑定数据卷之后,数据将在数据卷中持久化的存在,容器和数据卷的生命周期就相互隔离
docker应用部署
MySQL部署
mysql部署可以参数《各服务部署docker》-MySql部分
mkdir mysql
cd mysql
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
# 进入容器
docker exec -it c_mysql /bin/bash
# 使用MySQL
mysql -uroot -p
Tomcat部署
Nginx部署
mkdir nginx
cd nginx
mkdir conf
cd conf
vim nginx.conf #nginx启动需要配置文件
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include 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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
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:/user/share/nginx/html \
nginx
Redis部署
dockerfile
docker镜像原理
镜像制作
容器转为镜像
可写容器改变后制作成新的镜像,新的镜像包含了容器的部分改变,不是全部改变。不是目录挂载的都可以生效,目录挂载的不生效。也就是说创建目录、文件会生效,但是数据卷不会生效。
dockerfile创建镜像
制作自定义centos
需求:
- 默认登录路径为/user
- 可以使用vim
实现步骤:
- 定义父镜像:
FROM centos:7
- 定义作者信息:
MAINTAINER qdf <2210828779@qq.com>
- 执行安装vim命令:
RUN yum install -y vim
- 定义默认的工作目录:
WORKDIR /user
- 定义容器启动执行命令:
CMD /bin/bash
dockerfile内容:
FROM centos:7
MAINTAINER qdf <2210828779@qq.com>
RUN yum install -y vim
WORKDIR /user
CMD /bin/bash
创建镜像:
docker build -f ./centos_dockerfile -t qdf_centos:1 . # 在dockerfile同目录
服务编排
docker compose
docker-compose.yml示例:
# yaml 配置
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
使用docker-compose来部署开发环境
docker-compose的作用
docker-comopse可以帮助我们快速搭建起开发环境,比如你可以去把redis,mongodb,rabbitmq,mysql,eureka,configserver等一次部署在本机,然后让它们做为其它项目的基础,这是可以实现的。
容器之间的通讯-links
由于每个docker实例都是一个封闭的环境,所以默认情况下它们是不能共享的,即你的rabbit容器不能连接你的redis容器,你的configserver不能连接你的eureka容器,如果希望让它们之间进行数据通讯,需要设置links
属性来实现,而在本机(宿主机)上进行连接时,使用localhost和端口是可以访问这些容器的,这个我们要清楚。
启动顺序-depends_on
而对于启动顺序来说,比如你的configserver依赖于eureka,希望先启动被依赖的容器,再运行自己,这时我们可以使用depends_on属性来实现,当然它也只是启动顺序,不能保证服务真的越来后再去启动另一个,解决的方法是使用失败重试
机制restart: on-failure
,当configserver失败后,你可以重启,直到成功为止(主是直到eureka启动越来为止)。
容器与容器之间要用服务名通讯
如果我们的具体项目也希望部署到docker-compose里,希望去访问其它的服务,这时,需要使用docker-compose里定义的服务名称,而不是localhost,因为当你的容器起来之后,它的localhost是自己的容器,而不是宿主机,反之在宿主机上,如果希望访问容器,可以使用localhost
,这一点在前文中已经提到。
下面是我写的一个部署开发环境的例子
version: "3.3"
services:
# 公用组件相关配置
mongodb:
image: mongo:3.4.10
ports:
- "27017:27017"
networks:
- dev
volumes:
- mongo_data:/data/db
redis:
image: redis:3.2-alpine
networks:
- dev
ports:
- "6379:6379"
volumes:
- redis_data:/data
rabbit:
image: rabbitmq:3.6.10-management-alpine
hostname: rabbit
ports:
- "5672:5672"
- "15672:15672"
- "61613:61613"
networks:
- dev
environment:
RABBITMQ_DEFAULT_VHOST: pilipa
volumes:
- rabbitmq_data:/var/lib/rabbitmq
eurekaserver:
build: ./springcloud/eureka-server
restart: on-failure
ports:
- "8761:8761"
- "8762:8762"
networks:
- dev
configserver:
build: ./springcloud/config-server
restart: on-failure
ports:
- "8888:8888"
- "8889:8889"
networks:
- dev
depends_on:
- eurekaserver #依赖服务
links:
- eurekaserver
environment:
SPRING_PROFILES_ACTIVE: devops
volumes:
- /Users/lind.zhang/project/config-repo:/config_repo #前面是本地路径,后而是容器里的路径,在configserver里配置的是后面的容器路径
启动与更新
- 先打镜像
docker-compose build
- 再启动服务
docker-compose up -d #-d是后台运行
- 停止服务
docker-compose down
- 查看容器的日志
docker logs -f 容器ID
docker私有仓库
搭建私有仓库
# 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/deamon.json
# 5、在文件中添加以下内容,保存退出。此步用于让docker信任私有仓库地址
{"insecure-registries":[ip:5000]}
# 6、重启docker服务
systemctl restart docker
docker start registry
上传镜像
# 1、标记镜像设置为私有仓库镜像
docker tag centos:7 IP:5000/centos
# 2、上传标记的镜像
docker push IP:5000/centos:7
# 3、下载镜像时
docker pull IP:5000/镜像
# 4、删除下载的镜像时
docker rmi IP:5000/镜像
容器、虚拟机比较
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付