一、Docker安装
Docker在主流的操作系统和云平台上都可以使用,包括Linux操作 系统(如Ubuntu、Debian、CentOS、Redhat等)、MacOS操作系统和 Windows操作系统,以及AWS等云平台。
Docker官网:
https://docs.docker.com/
1. 卸载历史版本
# 查看安装
yum list installed | grep docker
# 卸载 (如果没有安装过,直接跳过卸载步骤)
yum -y remove containerd.io.x86_64
yum -y remove docker-ce.x86_64
yum -y remove docker-ce-cli.x86_64
# 删库
rm -rf /var/lib/docker
2. 安装官方yum源
# 安装utils,config-manager在utils中
yum install -y yum-utils
# 安装官方yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3. 安装Docker引擎
# 安装Docker引擎
yum install -y docker-ce docker-ce-cli containerd.io
4. 启动docker
# 开机启动
systemctl enable docker
# 启动
systemctl start docker
# 查看Docker状态
docker info
二、Docker操作
1. 使用Docker镜像
1.1 获取镜像
命令:
docker pull NAME[:TAG] (如果tag不指定,则默认拉取最新的镜像)
Dockerhub:镜像的公共库
描述一个镜像需要包括“名称+标签”信息
网址:https://hub.docker.com/
可以选择注册一个账户
不注册也可以进行镜像的拉去操作,但是不能上传
例如:
docker pull mysql:5.7.30
注意:
如果不显式指定TAG,则默认会选择latest标签,这会下载仓库中最新版本的镜像。
镜像的仓库名称中还应该添加仓库地址(即registry,注册服务器)作为前缀,
默认使用的是DockerHub服务,该前缀可以忽略
完整的命令格式:
docker pull registry.hub.docker.com/mysql:5.7.30
如果从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址
1.2 查看镜像信息
命令:
docker images
可以通过man docker-images查看更多命令参数
1.3 添加镜像标签
命令:
docker tag [原镜像名:tag号] [目标镜像名:tag号] # 如果tag号缺省,默认latest
例如:
docker tag mysql:5.7.30 mysql5
其实就是相同的一个image,设置了两个tag
1.4 查看镜像详细信息
命令:
docker inspect NAME[:TAG]
返回的是一个JSON格式的消息,如果我们只要其中一项内容时, 可以使用参数-f来指定
例如:
docker inspect mysql:5.7.30
查看具体参数:
docker inspect mysql:5.7.30 -f {{".属性名称"}}
1.5 搜寻镜像
命令:
docker search 名称
注意:
dockerhub仓库镜像, 私有仓库无法搜索到
1.6 删除镜像
命令:
docker rmi NAME[:TAG]
例如:
docker rmi mysql:5.7.30
docker rmi mysql5:latest
使用镜像ID删除镜像
docker pull nginx
注意:
如果有容器正在运行该镜像,则不能删除
如果想强行删除用 -f (不推荐)
1.7 上传镜像
命令:
docker push NAME[:TAG]
注意:
上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登录)
2. 操作Docker容器
2.1 创建容器
命令:
docker create NAME[:TAG]
可以加选项参数
-i 交互模式
-t 伪终端
-d 后台运行
-rm 容器退出后是否自动删除
例如:
docker create -it nginx
2.2 启动容器
命令:
docker start 容器id
例如:
docker start 0ab5ef79b786
2.3 查看容器状态
命令:
docker ps 查看运行的容器
查看运行的容器
docker ps
查看所有容器
docker ps -a
2.4 新建并启动容器
命令:
docker run NAME[:TAG]
相当于 docker create + docker start
可以加选项参数
--network host 使用宿主机IP地址
man docker run
docker run --help
例如:
docker run -it --rm --network host nginx
--rm 容器停止后自动卸载
--it 交互式
--network host 容器ip地址和宿主机ip地址一样
ctrl+c退出,容器停止,因为配置了rm,因此容器被移除
2.5 终止容器
命令:
docker stop 容器id -t 时间 (默认10秒)
首先向容器发送SIGTERM信号,等待一段超时时间(默认为10 秒)后,
再发送SIGKILL信号来终止容器
docker kill 容器id
docker kill 命令会直接发送SIGKILL信号来强行终止容器
例如:
# 后台 启动容器
docker run -it --rm -d --network host nginx
# -t 定时5s后关闭容器
docker stop 5c1ba38c3a45 -t 5
# 强制终止容器
docker kill 5c1ba38c3a45
处于终止状态的容器,可以通过docker start命令来重新启动
docker start ce554267d7a4
docker restart命令会将一个运行态的容器先终止,然后再重新启动
docker restart 090d67f05011
2.6 进入容器
命令:
docker exec -it [容器ID] /bin/bash
早期有attach命令,对于阻塞命令会等待,所以不方便
在Docker 1.3.0后提供了exec 可以在容器内直接执行任意命令
例如:
docker exec -it 090d67f05011 /bin/bash
无论在容器内进行何种操作,依据依据镜像创建的其他容器都不会受影响(由于namespace的隔离)(将数据持久化的除外) exec: 容器执行某操作,操作为容器ID后边的命令 -it: 以伪终端模式,这样我们就相当于进入到容器中了
2.7 查看容器
命令:
docker inspect [容器ID]
命令:
docker stats [容器ID]
2.8 删除容器
命令:
docker rm [容器ID]
docker rm命令只能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器
要直接删除一个运行中的容器,可以添加-f参数。Docker会先 发送SIGKILL信号给容器,终止其中的应
用,之后强行删除
3. 访问Docker仓库
Docker Hub是最大的公共镜像仓库(https://hub.docker.com/)
在公共仓库中注册一个账号,每ID可以免费拥有1个私有镜像
3.1 登录仓库
docker login -u username -p password
默认登陆的是docker hub
[root@localhost ~]# docker login -u 账号 -p 密码
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
登录成功的用户可以上传个人制造的镜像。
用户无需登录即可通过docker search命令来查找官方仓库中的镜 像,并利用docker pull命令来将它下载到本地
3.2 登出仓库
docker logout
可以同时登陆多个docker仓库,因此此命令一般不执行
[root@localhost ~]# docker logout
Removing login credentials for https://index.docker.io/v1/
3.3 认证文件
Mac/Win机器上的是隐藏密码的,但是在Linux下是显示密码的,只不过进行了base64编码, 只要拷贝
此文件到其他机器指定目录下(/root/.docker/config.json)即可免登录
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "Z2F2aW5saTgwczpsanAxMjM0NjU="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.12 (linux)"
}
}
4. 常用软件的容器化部署
4.1 Mysql
新建并启动mysql容器
docker pull mysql:5.7.30 # 拉取镜像操作可以省略
docker run --network host -e MYSQL_ROOT_PASSWORD=root -d --rm mysql:5.7.30
# 参数
--network host : 宿主机IP 不能再使用端口映射 -p 宿主机端口:容器端口 只能使用容器端口
--rm:当容器停止后,对容器及其申请的卷执行删除操作
-e key=value: 指定环境变量(此处指定了mysql root密码的环境变量,密码为root)
-d :后台运行
访问MySQL
mysql -h192.168.80.60 -uroot -proot
4.2 Tomcat
新建并启动Tomcat容器
docker pull tomcat:8.5.56-jdk8-openjdk # 拉取镜像操作可以省略(这是一个带着jdk的tomcat)
docker run -it --rm --network host tomcat:8.5.56-jdk8-openjdk
-it : 交互式伪客户端
--rm:当容器停止后,对容器及其申请的卷执行删除操作
--network host:宿主机IP
访问tomcat,报错,找不到资源(因为此时安装的Tomcat没有提供默认 的欢迎页面)
浏览器访问也访问不到默认的欢迎页面
解决:进入到容器中,创建项目
进入到运行中的容器:tomcat:8.5.56-jdk8-openjdk
创建项目目录:webapps
创建测试项目:dabing-project
在测试项目中创建欢迎页面:index.html
访问测试项目中的欢迎页面
4.3 Nginx
新建并启动Nginx容器
docker pull nginx # 拉取镜像操作可以省略
docker run --name nginx1 --network host -d nginx
--name:运行的容器名称
访问nginx
4.4 Redis
新建并启动Redis容器
docker pull redis:5.0.9
docker run --network host -d redis:5.0.9
访问Redis
注意:
如果宿主机也运行着redis,容器中的redis将无法启动,因为6379端口被占用了
解决:
将容器的6379端口转换成其他端口,就不会造成端口冲突了
5. Docker命令图谱