# 在执行这条命令的时候
systemctl enable docker
# 实际上是
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
# 替换文本
# s/regexp/replacement/[flags]
# The s command (as in substitute) is probably the most important in sed and has a lot of different options.
# The syntax of the s command is 's/regexp/replacement/flags'.
# sed处理过的输出是直接输出到屏幕上的,使用参数 "-i" 直接在文件中替换.
sed -i 's/原字符串/新字符串/' fileName
sed -i 's/原字符串/新字符串/g' fileName
sed -i 's#原字符串#新字符串#g' fileName
# 没有g的时候是, 每一行只替换第一个匹配的
# g Apply the replacement to all matches to the regexp, not just the first.
# 紧跟在s命令后的字符就是查找串和替换串之间的分隔符.
# 分隔符默认为正斜杠,但可以改变.无论什么字符(换行符,反斜线除外),只要紧跟s命令,就成了新的串分隔符.
# docker应用需要用到各种端口
# 所以启动docker前,要么将一些端口打开,要么直接关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
下载docker
1.先把这个文件https://download.docker.com/linux/centos/docker-ce.repo
弄到/etc/yum.repos.d
文件夹下。
2.执行yum clean all & yum makecache
。
3.列出所有版本yum list docker-ce --showduplicates | sort -r
。
4.安装指定版本yum install docker-ce-19.03.6 -y
。
5.检查docker -v
。
启动dockersystemctl start docker
。
配置docker源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://qs3r7qrp.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker基本命令
# 镜像命令
docker --help # 查看所有命令帮助
docker images --help # 查看 docker images 命令的帮助
docker pull nginx # 从dockerhub拉取nginx最新版镜像
docker search mongo # 列出仓库中带有mongo关键字的镜像
docker info # 查看docker信息
# 查看本地镜像
docker images
# 将本地镜像nginx:latest导出为一个nginx.tar文件
docker save -o nginx.tar nginx:latest
# 删除本地镜像nginx:latest
docker rmi nginx:latest
# 批量删除所有有关tomcat的镜像
docker image rm $(docker images tomcat -q)
# 从一个tar文件中加载镜像
docker load -i nginx.tar
# 容器相关命令
# 基于一些镜像创建一个容器,并指定容器名字, -d是后台运行
# 该命令会返回一个容器Id
docker run --name 容器名字 -p 宿主机端口:容器端口 -d 镜像1 镜像2 ....
# 查看容器运行状态
docker ps
# 查看容器日志
docker logs 容器名字
# 进入容器内,执行bash命令
docker exec -it 容器名字 bash
# 从容器中退出
exit
# 停掉容器
docker stop 容器名字
# 重新启动容器
docker start 容器名字
# 删除容器
docker rm 容器名字
# 删除所有容器
docker rm $(docker ps -qa)
# 暂停容器运行
docker pause/unpause 容器名字
数据卷
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
所有的数据卷都指向宿主机文件系统上的一个目录/var/lib/docker/volumes
。
docker在创建数据卷xxx的时候,会在宿主机/var/lib/docker/volumes
该目录下,创建一个xxx文件夹。
每一个数据卷都和宿主机上一个真实目录映射。
# 创建一个数据卷
docker volume create 数据卷名字
# 列出所有的volume
docker volume ls
# 查看volume的详细信息
docker volume inspect 数据卷名字
# 删除未使用的volume
docker volume prune
# 删除指定的volume
docker volume rm 数据卷名字
数据卷的作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全。
我们可以让容器内的目录和数据卷进行关联,本质是在和宿主机文件系统上的一个目录关联。
容器删了,数据卷不会跟着删。
# 在创建容器时,通过-v参数来挂载一个数据卷到某个容器目录(实现宿主机目录和容器内的某个目录的映射)
docker run \ # 创建并运行容器
--name 容器名字 \
-v 数据卷名字:容器内的目录 \ # 将该数据卷挂载到容器内的一个目录中(容器内的该目录 和 宿主机的某个目录就产生了关联)
-p 8080:80 \ # 宿主机和容器的端口映射
nginx
还可以将宿主机目录直接挂载到容器
# When you use a bind mount, a file or directory on the host machine is mounted into a container.
# The file or directory is referenced by its absolute path on the host machine.
# 如果宿主机该目录下有内容, 则直接覆盖容器内该目录下的默认内容
# 如果宿主机该目录是空目录, 则要么覆盖容器下的默认内容,即清空默认内容(nginx), 要么和容器内的默认内容一样(mysql)
# mysql会有一个Initializing database
# 在创建mysql容器的时候, 宿主机目录下不能有东西,否则导致数据库初始化失败
-v [宿主机目录(绝对路径)]:[容器内目录]
# 此后这两个路径下的内容就达到了同步
docker run
--name mysql_advance
-d
-v /root/mysql/data:/var/lib/mysql
-v /root/mysql/conf:/etc/mysql/conf.d/
-p 3306:3306
-e MYSQL_ROOT_PASSWORD=root
mysql:5.7.25
# 宿主机/root/tmp下的内容覆盖容器/usr/share/nginx/html下的默认内容
# 此后这两个路径下的内容会同步
docker run \
--name demo2 \
-p 81:80 \
-d \
-v /root/tmp:/usr/share/nginx/html \
nginx