Docker安装部署及基本操作(面试常问docker命令)

Docker安装部署

环境准备

主机名IP配置应用
docker0110.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的进程。如果这个进程结束了,容器就退出了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值