Docker安装部署
环境准备
主机名 | IP | 配置 | 应用 |
---|---|---|---|
docker01 | 10.0.0.100 | 建议2核4G 20G硬盘 | Docker |
Docker下载安装
# 清华源镜像站帮助
https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
# 卸载原来装过的docker
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安装一些依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加docker yum源
一般用vim改,这回用yum-config-manager
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@docker01 /etc/yum.repos.d]# ll
total 12
-rw-r--r-- 1 root root 2523 Aug 4 2022 CentOS-Base.repo
-rw-r--r-- 1 root root 2261 Feb 27 10:26 docker-ce.repo
-rw-r--r-- 1 root root 664 Aug 4 2022 epel.repo
# 把软件仓库地址替换为清华源:
sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 直接安装最新版
yum install docker-ce -y
# 查看版本
[root@docker01 ~]# docker version
Client: Docker Engine - Community
Version: 23.0.1
API version: 1.42
Go version: go1.19.5
Git commit: a5ee5b1
Built: Thu Feb 9 19:51:00 2023
OS/Arch: linux/amd64
Context: default
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
# 启动
[root@docker01 ~]# systemctl start docker
[root@docker01 ~]# docker version //启动后再docker version便可以看到服务端信息
[root@docker01 ~]# ps -ef|grep docker
root 6825 1 3 22:41 ? 00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root 7045 6762 0 22:41 pts/0 00:00:00 grep --color=auto docker
# 停止docker服务端
systemctl stop docker.socket
配置docker镜像加速
因为docker的镜像都在国外。所有借助下阿里云docker镜像加速服务:
登录阿里云–>控制台–>找到容器镜像服务–>安装说明修改docker配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://hsjsl6wz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
运行第一个容器
[root@docker01 ~]# docker run alpine /bin/echo "Hello World"
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
59bf1c3509f3: Pull complete
Digest: sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300
Status: Downloaded newer image for alpine:latest
Hello World
#// alpine 是镜像的名字,本机没有的话它会自动去dockerhub(https://hub.docker.com)拉取
[root@docker01 ~]# docker ps -a //查看所有容器,发现刚运行的alpine已经退出了。因为它运行命令,活干完了
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c88cfa3e634a alpine "/bin/echo 'Hello Wo…" 16 seconds ago Exited (0) 16 seconds ago naughty_euler
Docker基本操作:镜像相关
## 搜索镜像(就是从dockerhub搜索)
[root@docker01 ~]# docker search nginx
但很少用命令搜,一般去官网
## 拉取镜像
#docker pull <仓库名>:<标签名> 如果不给标签,那么默认会以Latest作为默认标签
dockerhub官网:https://hub.docker.com/_/centos/tags
比如:拉取centos镜像(tag:7)
[root@docker01 ~]# docker pull centos:7
## 查看当前所有镜像
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest c059bfaa849c 15 months ago 5.59MB
centos 7 eeb6ee3f44bd 17 months ago 204MB #//很小
或者:
[root@docker01 ~]# docker image ls
## 只查看镜像ID
[root@docker01 ~]# docker images -q
c059bfaa849c
eeb6ee3f44bd
## 删除某个镜像
docker rmi <镜像ID>
[root@docker01 ~]# docker rmi c059bfaa849c
报错:需要先删容器,再删镜像
## 导出镜像:docker save
[root@docker01 ~]# docker (image) save centos:7 -o /root/centos7.tar.gz
-o:output 输出
centos7.tar.gz:导出后自定义的包名
上面命令等价于:
[root@docker01 ~]# docker save centos:7 > centos7_v2.tar.gz
[root@docker01 ~]# ll
total 206740
-rw-------. 1 root root 1512 Sep 9 18:15 anaconda-ks.cfg
-rw------- 1 root root 211696640 Feb 27 17:12 centos7.tar.gz
## 导入镜像:docker load
-i:input 输入
[root@docker01 ~]# scp centos7.tar.gz 172.16.1.101:/root
[root@docker02 ~]# docker load -i centos7.tar.gz
[root@docker02 ~]# docker load < centos7.tar.gz
174f56854903: Loading layer [==================================================>] 211.7MB/211.7MB
Loaded image: centos:7
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest c059bfaa849c 15 months ago 5.59MB
centos 7 eeb6ee3f44bd 17 months ago 204MB
## 修改镜像标签
docker tag
Docker基本操作:容器相关
## 查看正在运行的容器
docker (container) ps
= docker container ls
[root@docker01 ~]# docker ps //目前没有运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
## 查看所有的容器
docker ps -a(--all)
docker ps -qa(--quite),Only display container IDs,只看容器ID
## 关闭和重启容器
docker stop <容器ID>
docker restart <容器ID>
## 创建并运行一个容器
docker run -it <镜像名> <传递一个命令:即启动后运行的第一个程序>
docker run时如没有镜像,它会自动先去 dockerhub 拉取镜像
run:创建并运行一个容器
-it:提供一个可以交互的终端(interactive tty)。只有这样我们才能进去敲命令
-d:将容器放在后台运行。
--name:运行容器时,给容器一个名字,这样就可以不用ID(容器名也是唯一的)
#不常用:
创建和启动容器,一个run就取代了
docker create
docker start <容器ID>
## 例:创建并运行一个以centos:7为基础镜像的容器
[root@docker01 ~]# docker run -it centos:7 /bin/bash ///bin/bash:让这个容器提供一个bash
[root@58736b06b639 /]# ll /root
total 4
-rw------- 1 root root 3416 Nov 13 2020 anaconda-ks.cfg
[root@58736b06b639 /]# hostname -I //查看容器IP
172.17.0.2
这哪来的IP呢?
宿主机上看一下,当你装完docker之后,多了一个docker0网卡。起的容器与这块网卡进行桥接的,你再起一个就是172.17.0.3,依次类推,所以都在同一网段。
[root@docker01 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::42:20ff:fed4:87a4 prefixlen 64 scopeid 0x20<link>
ether 02:42:20:d4:87:a4 txqueuelen 0 (Ethernet)
RX packets 87178 bytes 30519292 (29.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 112970 bytes 381540440 (363.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#但这种是一次性的,退出后就没了。
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a5375f98dcd centos:7 "/bin/bash" 3 minutes ago Up 3 minutes trusting_bouman
[root@58736b06b639 /]# exit //退出容器
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#重新run的话也变新容器了。
[root@docker01 ~]# docker run -it centos:7 /bin/bash //重新run就会变新容器,ID变了,不是刚才那个容器了
[root@dd4d6a069302 /]#
[root@docker01 ~]# docker ps -a //可以查看所有容器,包括刚退出的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd4d6a069302 centos:7 "/bin/bash" 40 seconds ago Up 40 seconds pensive_proskuriakova
7a5375f98dcd centos:7 "/bin/bash" 6 minutes ago Exited (0) 2 minutes ago trusting_bouman
#那么如何让它不退出?加上-d参数即可,这样它会一直在后台运行
[root@docker01 ~]# docker run -it -d centos:7
69c29f97d71b8eeed548a25ee4cfd738384a8355df67c3d809fa61bfb3a6095e
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69c29f97d71b centos:7 "/bin/bash" 13 seconds ago Up 12 seconds elated_rubin
dd4d6a069302 centos:7 "/bin/bash" 6 minutes ago Exited (0) 4 minutes ago pensive_proskuriakova
7a5375f98dcd centos:7 "/bin/bash" 12 minutes ago Exited (0) 7 minutes ago trusting_bouman
[root@docker01 ~]# docker exec -it 69c29f97d /bin/bash //进入正在运行的容器(分配一个新终端)
[root@69c29f97d71b /]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11828 1732 pts/0 Ss+ 19:06 0:00 /bin/bash
...
docker attach 进入正在运行的容器(使用相同终端)。没啥用
## 停止容器
docker stop <容器名>|<容器ID>
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69c29f97d71b centos:7 "/bin/bash" 5 minutes ago Up 5 minutes elated_rubin
[root@docker01 ~]# docker stop 69c29f97d7
69c29f97d7
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69c29f97d71b centos:7 "/bin/bash" 5 minutes ago Exited (137) 5 seconds ago elated_rubin
## 删除容器
docker rm <容器名>|<容器ID>
## 强制停止容器
docker kill <容器名>|<容器ID>
## 停止和删除所有容器
docker stop $(docker ps -qa)
docker rm $(docker ps -qa)
##重要: docker设计理念:
# 1.一个容器只做一件事
比如我要搞个wordpress,就要分三个容器去装:一个容器nginx 一个php 一个mysql
# 2.容器运行的前提条件是容器内PID为1的进程不退出
比如:
docker run alpine /bin/echo "Hello World"
docker run -it centos:7 /bin/bash
/bin/bash、/bin/echo "Hello World" 就是告诉它pid为1的进程。如果这个进程结束了,容器就退出了