docker

docker 官方地址 Docker Documentation | Docker Documentation

docker 默认工作路径 /var/lib/docker

docker安装

脚本安装

1
curl -sSL https://get.daocloud.io/docker | sh

手动安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#卸载老版本的docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#设置yum仓库下载源
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker
sudo yum install docker-ce docker-ce-cli containerd.io

配置docker镜像加速

阿里云镜像加速地址: 容器镜像服务 (aliyun.com)

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

配置docker开机启动

1
systemctl enable docker

Docker镜像相关命令

查看本地镜像

1
docker images

寻找镜像

1
docker search 镜像名称

下载镜像

1
docker pull 镜像名称:版本号(默认是latest)

可以通过 Docker Hub 查看镜像具体版本

删除镜像

1
2
3
docker rmi 镜像id(镜像id可以通过docker images查看)
#删除所有镜像
docker rmi `docker images -q`

Docker容器相关命令

镜像和容器就好比类和对象的关系,可以通过镜像创建多个容器,容器就是镜像的实例化对象

创建容器

1
2
3
4
5
6
7
8
docker run -it --name=c1 centos:7 /bin/bash
# -i 保持容器一直运行
# -t 给容器创建一个终端
# --name= 给容器创建id
# centos:7 用什么镜像创建
# /bin/bash 进入容器
docker run -it --name=c2 centos:7
# -d 后台运行,不会立即进入容器内,容器内退出后也不会关闭
  • -it 创建的容器一般被称为交互式容器
  • -id 创建的容器一般被成为守护式容器

查看正在运行的容器

1
2
docker ps -a
# -a 查看所有容器,包括历史容器

进入容器

1
docker exec -it c2 /bin/bash #进入容器,只能进入守护式容器

退出容器

1
exit #从容器中退出

关闭容器

1
docker stop 容器名称(通过--name设置的名称)

启动容器

1
docker start 容器名称

删除容器

1
2
docker rm 容器名称或者容器id #不能够删除正在运行的容器
docker rm `docker ps -a` #删除所有容器

检查容器

1
docker inspect 容器名称

容器的数据卷

  • 数据卷是宿主机的一个目录或文件
  • 当容器目录和数据卷绑定后,双方的修改会同步
  • 一个数据卷可以被多个容器挂载

配置数据卷

1
2
3
4
5
# 创建容器时,使用-v参数设置数据卷
docker run -v 宿主机目录(文件):容器内目录(文件)
# 目录必须是绝对路径
# 如果目录不存在,会自动创建
# 可以挂载多个数据卷

数据卷容器

1
2
3
4
docker run -it --name=数据卷容器名称 -v /volume centos:7
# 这时-v参数并不是宿主机目录(文件):容器内目录(文件),而是直接接了一个目录,此时宿主机会在/var/lib/docker/volumes/随机名称/_data里存放数据

docker run -it --name=容器名称 --volumes-from 数据卷容器名称 centos:7

应用部署

MySQL部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cd /home/kuang
mkdir mysql
cd mysql

docker search mysql
docker pull mysql:5.7

#mysql 端口3306
docker run -p 3306:3306 --name mysql \
-v /home/docker/mysql/log:/var/log/mysql \
-v /home/docker/mysql/data:/var/lib/mysql \
-v /home/docker/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart=always\
-d mysql:5.7



1
2
3
4
5
6
7
8
9
docker run:在docker中启动一个容器实例
-d:该容器在后台运行
-p 3306:3306:容器与主机映射端口为,主机3306,容器3306
--name mysql:容器运行后的名称
-v /mysqldata/mysql/log:/var/log/mysql:将容器/var/log/mysql目录下的数据,备份到主机的 /mysqldata/mysql/log目录下
-v /mysqldata/mysql/data:/var/lib/mysql:将容器/var/lib/mysql目录下的数据,备份到主机的 /mysqldata/mysql/data目录下
-v /mysqldata/mysql/conf:/etc/mysql:将容器/etc/mysql目录下的数据,备份到主机的 mysqldata/mysql/conf目录下
-e MYSQL_ROOT_PASSWORD=root:设置当前mysql实例的密码为root
mysql:5.7:需要运行的容器名称以及版本号
1
2
3
4
5
6
7
8
9
10
11
12
#切换到上述命令配置的主机/mysqldata/mysql/conf目录下
cd /home/docker/mysql/conf
#创建 my.cnf文件
touch my.cnf
#使用vim命令对 my.cnf文件添加如下内容,在docker中安装的mysql默认字符集是latin1,需要改成utf8
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
#重启mysql容器实例,让刚才的配置文件生效
docker restart mysql

Tomcat部署

1
2
3
4
5
6
7
8
9
10
11
12
13
cd /home/kuang
mkdir tomcat
cd tomcat

docker search tomcat
docker pull tomcat

#tomcat端口8080
docker run -id\
-p 宿主机端口:容器端口\
--name=容器名称\
-v $PWD:/usr/local/tomcat/webapps\
tomcat:9

Nginx部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cd /home/kuang
mkdir Nginx
cd Nginx
mkdir conf
cd conf
touch nginx.conf
cd ..

docker search Nginx
docker pull Nginx

#Nginx端口80
docker run -id\
--name=容器名称\
-p 宿主机端口:容器端口\
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf\
-v $PWD/logs:/var/log/nginx\
-v $PWD/html:/usr/share/nginx/html\
nginx:latest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!--nginx.conf文件-->
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/logs/nginx/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;

include /etc/nginx/conf.d/*.conf

}

Redis部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cd /home/kuang
mkdir Redis
cd Redis

docker search redis
docker pull redis:latest

#首先在要映射的conf文件夹下创建redis.conf文件

#Redis端口6379
docker run \
-p 6379:6379\
--restart always\
-v /home/docker/redis/conf/redis.conf:/etc/redis/redis.conf\
-v /home/docker/redis/data:/data\
--name redis\
-d redis redis-server /etc/redis/redis.conf\
--appendonly yes

#重接 开机自启动
docker run --restart=always

ElasticSearch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#首先安装elasticsearch
#在要映射config的文件中创建elasticsearch.yml
echo "http.host: 0.0.0.0">>/home/docker/es/config/elasticsearch.yml


docker run --name es\
-p 9200:9200 -p 9300:9300\
-e "discovery.type=single-node"\
-e ES_JAVA_OPTS="-Xms128m -Xmx512m"\
-v /home/docker/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml\
-v /home/docker/es/data:/usr/share/elasticsearch/data\
-v /home/docker/es/plugins:/usr/share/elasticsearch/plugins\
--restart=always\
-d elasticsearch:7.4.2

#安装kibana
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.80.3:9200 -p 5601:5601 --restart=always -d kibana:7.4.2

RabbitMQ

1
2
3
4
docker run -d --name mq \
-p 5671:5671 -p 5672:5672 -p 4369:4369 \
-p 25672:25672 -p 15671:15671 -p 15672:15672 \
rabbitmq:management

Dockerfile

Docker镜像本质是一个分层文件系统

容器转为镜像

1
2
3
4
5
6
7
8
#制作镜像
docker commit 容器id 镜像名称:版本号

#镜像不能传输,需要将镜像变成一个文件
docker save -o 压缩文件名称 镜像名称:版本号

#拿到镜像压缩文件后,将压缩文件还原成镜像
docker load -i 压缩文件名称

dockerfile

1
2
3
4
FROM java:8
MAINTAINER kuang<zuoyenuandong@qq.com>
ADD jar包名称 目标jar名称
CMD java -jar 目标jar名称
1
docker build -f dockerfile文件名称 -t 镜像名称 . #最后有个参数.

dockerfile案例

自定义CentOS7镜像。要求

  • 默认登录路径为/usr
  • 可以使用vim
1
2
3
4
5
6
7
FROM centos:7
MAINTAINER kuang<zuoyenuandong@qq.com>

RUN yum install -y vim
WORKDIR /usr

cmd /bin/bash
1
2
3
4
5
vim centos_dockerfile
#
#编写dockerfile内容
#
docker build -f ./centos_dockerfile -t mycentos:1.0 .

docker compose

安装docker compose

1
2
3
4
5
6
7
8
#下载二进制包(可以自己替换版本)
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#将可执行权限应用于二进制文件
$ sudo chmod +x /usr/local/bin/docker-compose
#创建软链
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
#测试是否安装成功
$ docker-compose --version

编写docker-compose.yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3'
services:
应用名称:
image: 镜像名称
ports:
- 宿主机端口:容器端口
volumes: .
- 宿主机目录(文件):容器内目录(文件)
- 宿主机目录(文件):容器内目录(文件)
links:
- 其他应用名称
应用名称:
image: 镜像名称
expose: 端口号

启动docker compose

1
docker-compose up -d

私有仓库

创建私有仓库

1
2
3
4
5
6
7
8
9
10
11
12
#拉取私有仓库镜像
docker pull registry
#启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
#打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog。看到{"repositories":[]}表示私有仓库搭建成功

#修改daemon.json,在文件中添加一个key,让docker信任私有仓库地址
vim /etc/docker/daemon.json
#重启docker
systemctl restart docker
#重新开启服务
docker start registry
1
{"insecure-registries":["私有仓库服务器ip:5000"]}

将镜像上传私有仓库

1
2
3
4
#标记镜像为私有仓库镜像
docker tag centos:7 私有仓库服务器ip:5000/centos:7
#上传标记镜像
docker push 私有仓库服务器ip:5000/centos:7

拉去私有仓库镜像

1
docker pull 私有仓库服务器ip:5000/centos:7