文章目录
镜像是文件,容器是进程。
容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。
虚拟化容器技术,Docker 基于镜像,可以秒级启动各种容器,每一种容器都是一个完整的运行环境,容器之间相互隔离。
1、Docker 安装
- 利用官方 shell 脚本安装最新版的 docker (通过 --mirror 选项使用国内源进行安装)
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
- 启动 docker 服务
systemctl start docker
- 使用
docker version
命令查看 docker 版本,并校验 docker 服务是否启动成功
[root@VM-0-16-centos username] docker version
Client: Docker Engine - Community
Version: 19.03.13
API version: 1.40
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:03:45 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.13
API version: 1.40 (minimum version 1.12)
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:02:21 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.3.7
GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
- 设置 docker 服务为自动启动
systemctl enable docker
- 配置阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://dph1a55y.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2、Docker 卸载
- 查看已安装的版本
[root@VM-0-16-centos username] yum list installed|grep docker
containerd.io.x86_64 1.3.7-3.1.el7 @docker-ce-stable
docker-ce.x86_64 3:19.03.13-3.el7 @docker-ce-stable
docker-ce-cli.x86_64 1:19.03.13-3.el7 @docker-ce-stable
- 卸载
yum -y remove containerd.io.x86_64
yum -y remove docker-ce.x86_64
yum -y remove docker-ce-cli.x86_64
3、Docker 常用命令
3.1、Docker 的镜像管理
- 查看镜像列表
docker images
docker image ls
- 导出镜像
docker save -o <保存路径> <镜像名称(REPOSITORY):标签(TAG)>
或
docker save > <保存路径> <镜像名称(REPOSITORY):标签(TAG)>
其中 -o
和 >
表示输出到文件,<保存路径>
为目标文件,<镜像名称(REPOSITORY):标签(TAG)>
是源镜像名。
- 导入镜像
docker load -i xxx.tar
或
docker load < xxx.tar
其中 -i
和 <
表示从文件输入,会成功导入镜像及相关元数据,包括 tag 信息。
- 删除镜像
docker image rm `<镜像名称(REPOSITORY):标签(TAG)> or <IMAGE ID>`
或
docker rmi `<镜像名称(REPOSITORY):标签(TAG)> or <IMAGE ID>`
- 搜索镜像
docker search <IMAGE NAME>
- 给源中镜像打标签
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag mysql mysql:v1
- 推送指定镜像到 Docker 镜像源服务器
docker push <镜像名称(REPOSITORY):标签(TAG)>
- 拉取镜像
docker pull <镜像名称(REPOSITORY):标签(TAG)>
- 显示一个镜像的历史
docker history <镜像名称(REPOSITORY):标签(TAG)>
- 构建镜像
先切换到工程目录中(也就是 Dockerfile
存在的目录)
docker build -t <镜像名称(REPOSITORY):标签(TAG)> . ` 点(.) 一定不能去掉 # 使用当前目录下的Dockerfile 构建镜像`
3.2、Docker 的容器管理
- 查看 docker 版本
docker -v
- 查看 docker 信息
docker info
- 运行容器
docker run -itd --name <自定义容器名称> -p <宿主机端口>:<容器端口> \
-v <宿主机文件或文件夹全路径>:<容器内部文件或文件夹全路径> \ # 可多个
<镜像名称(REPOSITORY):标签(TAG)>
详细参数:
run 创建并运行一个容器
-d 后台运行
-P(大写) 容器内部端口随机映射到主机端口
-p(小写) 容器内部端口绑定到指定的主机端口
-v 源地址(宿主机):目标地址(容器) # 挂载目录到宿主机(宿主机全路径)
-it 分配交互式的终端
--name 指定容器的名字
/bin/sh 覆盖容器的初始命令
- 停止容器
docker stop `<CONTAINER ID> or <NAMES>`
- 移除容器
docker rm <CONTAINER ID>
<NAMES>
docker rm -f 'docker ps -a -q' # 删除所有容器
- 杀死容器
docker kill `<CONTAINER ID> or <NAMES>`
- 查看容器列表
docker ps (-a -l -q)
- 进入指定容器
docker exec -it `<CONTAINER ID> or <NAMES>` /bin/bash # 退出容器终端,不会导致容器的停止
9.开启/停止/c=重启 指定容器id或者容器名称的容器
docker start/stop/restart `<CONTAINER ID> or <NAMES>`
- 查看容器日志
docker logs `<CONTAINER ID> or <NAMES>`
- 查看容器状态
docker ps | grep ${CONTAINER_ID}
- 镜像打包(保存对容器的修改)
docker commit <CONTAINER ID> <新的镜像名称(REPOSITORY):标签(TAG)>
-m="提交的描述信息"
-a="作者"
- 查看容器内部详情细节
docker inspect `<CONTAINER ID> or <NAMES>`
-
docker login
登录 -
Ctrl+P+Q
退出而不关闭容器
4、Docker 安装 MySQL
- 使用
docker search mysql
命令查看可用版本
docker search mysql
- 拉取 MySQL 镜像
拉取官方的最新版本的镜像
docker pull mysql:latest
- 创建外部映射目录
conf.d
data
logs
[root@VM-0-16-centos mysql] pwd
/usr/local/docker/mysql
[root@VM-0-16-centos mysql] ls
conf data logs
- 启动 MySQL 容器
-p <主机端口>:<容器内部端口>
docker run -p 3306:3306 --name mysql-v1 \
-e MYSQL_ROOT_PASSWORD=123456 \
-itd mysql
- 拷贝
mysql-v1
内部配置文件到conf
目录
docker cp mysql-v1:/etc/mysql/my.cnf /usr/local/docker/mysql/conf/
- 停止并移除
mysql-v1
容器
docker stop mysql-v1
docker rm mysql-v1
- 修改覆盖
my.cnf
文件
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure-file-priv= /var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
- 启动 MySQL 容器
docker run -p 3306:3306 --name mysql-v1 \
--restart=always \
--privileged=true \
-v /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql
参数说明
--restart=always:当 Docker 重启时, 容器会自动启动
--privileged=true:容器内的 root 拥有真正 root 权限, 否则容器内 root 只是外部普通用户权限
-v /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf:映射配置文件
-v /usr/local/docker/mysql/data:/var/lib/mysql:映射数据目录
-v /usr/local/docker/mysql/logs:/var/log/mysql:映射日志信息
-v /etc/localtime:/etc/localtime:解决容器时间与主机时间不一致
报错问题解决
注意:启动 MySQL 报如下错误,那是因为 MySQL 新特性secure_file_priv
对读写文件的影响。
mysqld: Error on realpath() on ‘/var/lib/mysql-files’ (Error 2 - No such file or directory)
修改 my.cnf
文件:在 [mysqld] 内加入 secure_file_priv=/var/lib/mysql
- 进入
mysql-v1
容器
docker exec -it mysql-v1 /bin/bash
- 登录 MySQL
mysql -u root -p
- 添加远程登录用户
按需执行
CREATE USER 'yourname'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpassword';
GRANT ALL PRIVILEGES ON *.* TO 'yourname'@'%';
- 刷新权限
flush privileges;
5、Docker 安装 Redis
5.1、不指定配置文件方式启动
- 拉取官方的最新版本的镜像
docker pull redis:latest
- 查看本地镜像
使用 docker images
命令来查看是否已安装了 Redis
- 运行 Redis 容器
docker run -itd --name redis-v2 -p 6378:6378 redis
- 使用
docker ps
命令查看容器的运行信息
- 通过
redis-cli
连接测试使用redis
服务
docker exec -it redis-v2 /bin/bash
redis-cli
5.2、指定配置文件方式启动(与上一步有联系)
-
拉取官方的最新版本的镜像
docker pull redis:latest
-
查看本地镜像
docker images
-
从官网获取
redis.conf
配置文件(注意和自己的 Redis 版本一致)
查看已安装 Redis 的版本
docker exec -it redis-v2 redis-server -v
- 修改默认配置文件
redis.conf
bind 127.0.0.1 # 注释掉这部分,这是限制 redis 只能本地访问
protected-mode no # 默认 yes,开启保护模式,限制为本地访问
daemonize no # 默认 no,改为 yes 意为以守护进程方式启动,可后台运行,除非 kill 进程(可选),改为 yes 会使配置文件方式启动 redis 失败
dir ./ # 输入本地 redis 数据库存放文件夹(可选)
appendonly yes # redis 持久化(可选)
- 创建 Redis 挂载目录,并将指定版本的 redis.conf 配置文件复制到此目录(上传文件失败,选用 root 用户登陆)
[root@VM-0-16-centos redis] pwd
/usr/local/docker/redis
[root@VM-0-16-centos redis] ls
data redis.conf
5.使用配置文件启动 Redis
docker run -p 6379:6379 --name redis-v1 \
-v /usr/local/docker/redis/redis.conf:/etc/redis/redis.conf \
-v /usr/local/docker/redis/data:/data \
-d redis redis-server /etc/redis/redis.conf \
--appendonly yes
命令解释:
-p 6379:6379 # 端口映射, 前面表示主机端口:后面表示容器端口
--name redis-v1 # 指定该容器名称, 方便查看和进行操作
-v # 挂载目录, 前面表示主机全路径:后面表示容器全路径
-d redis # 表示后台启动 redis
redis-server /etc/redis/redis.conf # 以配置文件启动 redis, 加载容器内的 conf 文件, 最终找到的是挂载的目录 /usr/local/docker/redis.conf
appendonly yes # 开启 redis 持久化
- 运行
docker ps
看一下可以看到 Redis 已经运行成功了,如果没成功请用docker logs redis-v1
看一下打印日志,99% 为配置文件版本不一致问题
6、Docker 安装 Nginx
6.1、安装 Nginx
-
拉取官方的最新版本的镜像
docker pull nginx:latest
-
查看本地镜像
docker images
-
启动 Nginx
docker run -itd -p 8080:80 --name nginx-v1 nginx:latest
目录结构
├── conf
│ └── nginx.conf
├── conf.d
│ └── default.conf
├── html
│ └── 1.html
└── logs
├── access.log
└── error.log
执行命令,挂载目录
docker run -itd -p 8080:8080 --name nginx-v1 \
--restart=always \
--privileged=true \
-v /home/qianjinlong/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/qianjinlong/docker/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-v /home/qianjinlong/docker/nginx/html/:/usr/share/nginx/html/ \
-v /home/qianjinlong/docker/nginx/logs:/var/log/nginx \
nginx:latest
docker run -itd -p 宿主机端口:容器端口 --name 容器名称
-v 宿主机文件或文件夹全路径:容器内部文件或文件夹全路径
镜像名称
查看挂载目录
docker inspect <container_id\container_name> | grep Mounts -A 20
"Mounts": [
{
"Type": "bind",
"Source": "/home/qianjinlong/docker/nginx/html",
"Destination": "/user/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/home/qianjinlong/docker/nginx/conf/nginx.conf",
"Destination": "/etc/nginx/nginx.conf",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/home/qianjinlong/docker/nginx/conf.d/default.conf",
"Destination": "/etc/nginx/conf.d/default.conf",
修改配置文件
[root@VM-0-16-centos nginx]# cat conf.d/default.conf
server {
listen 8080;
# listen [::]:8080;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index 1.html;
}
#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 /usr/share/nginx/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;
#}
}
- 访问测试
未完待续 …