目录

1、常用命令汇集

1.1、dokcer verion

1.2、docker images

1.3、docker search

1.3.1、docker pull

1.4、docker ps

1.4.1、docker start

1.4.2、docker stop

1.4.3、docker rm

1.4.4、docker run

1.4.5、docker top + 容器名字

1.5、docker logs + 容器名字

1.6、dokcer exec

1.6.1、进入容器之后,很多命令不可以使用

1.7、启动MySQL容器

1.7.1、在Ubuntu里启动MySQL

1.7.2、在centos里启动MySQL

1.7.3、区别MySQL是宿主机的还是容器的的方法

1.8、docker create

1.9、docker container inspect + 容器名字

1.9.1、 为什么容器也有IP地址呢?

1.9.2、 run一个容器的时候,加"-p"映射端口会发生一些什么变化?

1.9.3、docker容器上网的问题

1.9.4、用docker里的centos镜像下载tree和vim命令

1.10、dockers rmi + 镜像名字

1.11、限制容器可以使用的cpu和内存资源

1.11.1 、OOM的面试问题

2、容器的状态

3、访问MySQL的方式

3.1、使用mysql.socket文件去连接

3.2、通过网络socket

3.2.1、docker服务重启

3.2.2、docker重启和清楚防火墙规则的顺序

4、内存溢出(oom,out of memory)


1、常用命令汇集

Ubuntu的命令一般只需要在centos的命令的基础上,在前边加上sudo就行        

1.1、dokcer verion

[root@localhost ~]# docker version
Client: Docker Engine - Community  # 社区版本
 Version:           20.10.14
 API version:       1.41
 Go version:        go1.16.15  # 因为docker使用go语言开发的
 Git commit:        a224086
 Built:             Thu Mar 24 01:49:57 2022
 OS/Arch:           linux/amd64  # 这个docker是装在linux上的
 Context:           default
 Experimental:      true

Server: Docker Engine - Community  # 这里是分客户机和服务机的
 Engine:
  Version:          20.10.14
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.15
  Git commit:       87a90dc
  Built:            Thu Mar 24 01:48:24 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.5.11
  GitCommit:        3df54a852345ae127d1fa3092b95168e4a88e2f8
 runc:
  Version:          1.0.3
  GitCommit:        v1.0.3-0-gf46b6ba
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

1.2、docker images

查看你的dokcer里边有哪些镜像

[root@localhost ~]# docker images
REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
hello-world         latest    feb5d9fea6a5   6 months ago    13.3kB
daocloud.io/nginx   latest    6084105296a9   13 months ago   133MB
# 镜像名字           标签        编码         什么时候创建的     多大

1.3、docker search

查看哪有镜像,例如,nginx

[root@localhost ~]#  docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        16635     [OK]       
bitnami/nginx                                     Bitnami nginx Docker Image                      122                  [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   40                   
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   17                   [OK]
。。。。。

stars越多,表示这个镜像越受欢迎 。若是想要下载镜像,我们可以先使用docker search 查找之后,再进行选择你想要下载的镜像。下载命令"docker pull + NAME",这个NAME就是docker search查找到的NAME。

1.3.1、docker pull

🍓[下载mysql]🍓

[root@localhost ~]# docker pull mysql

下载指定版本的mysql,参考官方网站的文献:Docker Hub

[root@localhost ~]# docker pull mysql:5.7.37  # 指定下载MySQL的版本

🍓[查看结果]🍓

[root@localhost ~]# docker images
REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
mysql               5.7.37    f26e21ddd20d   2 weeks ago     450MB
mysql               latest    667ee8fb158e   2 weeks ago     521MB
hello-world         latest    feb5d9fea6a5   6 months ago    13.3kB
daocloud.io/nginx   latest    6084105296a9   13 months ago   133MB

1.4、docker ps

查看目前启动的docker容器;

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost ~]# docker ps -a  # -a之后,能够看到运行或者停止的docker容器,
CONTAINER ID   IMAGE               COMMAND                  CREATED        STATUS                    PORTS     NAMES
668f7bfbac94   daocloud.io/nginx   "/docker-entrypoint.…"   21 hours ago   Exited (0) 19 hours ago             fan-nginx-2
0f1c0c7fdc0d   daocloud.io/nginx   "/docker-entrypoint.…"   22 hours ago   Exited (0) 21 hours ago             fan-nginx-1
2b180d53996f   hello-world         "/hello"                 22 hours ago   Exited (0) 22 hours ago             goofy_cray


#   -a, --all             Show all containers (default shows just running)

1.4.1、docker start

开启某个docker容器。可以+docker的id启动,也可以用docker的名字启动。

[root@localhost ~]# docker start fan-nginx-1
fan-nginx-1
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED        STATUS         PORTS                                   NAMES
0f1c0c7fdc0d   daocloud.io/nginx   "/docker-entrypoint.…"   23 hours ago   Up 3 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   fan-nginx-1

1.4.2、docker stop

停止某个docker容器

[root@localhost ~]# docker stop fan-nginx-1
fan-nginx-1
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

1.4.3、docker rm

注意这个要删除的容器必须是关闭的才能够删除

[root@localhost ~]# docker rm fan-nginx-1
fan-nginx-1
[root@localhost ~]# docker ps -a | grep fan-nginx
668f7bfbac94   daocloud.io/nginx   "/docker-entrypoint.…"   22 hours ago   Exited (0) 20 hours ago             fan-nginx-2

# 这里可以看到"fan-nginx-1"已经被删除了

1.4.4、docker run

docker run = docker create + docker start

 类似流程如下图:

1.4.5、docker top + 容器名字

可以查看容器里边运行了哪些命令

fmy@dockerserever:~$ sudo docker top fan-nginx-1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4567                4547                0                   03:03               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            4616                4567                0                   03:03               ?                   00:00:00            nginx: worker process
systemd+            4617                4567                0                   03:03               ?                   00:00:00            nginx: worker process

1.5、docker logs + 容器名字

可以查看容器启动的过程中的日志,可以用来排错使用。

1.6、dokcer exec

这个命令可以进入容器里边。你可以是用"docker exec --help来看它的语法字典"

fmy@dockerserever:~$ sudo docker exec --help
[sudo] password for fmy: 

Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

Options:
  -d, --detach               Detached mode: run command in the background
      --detach-keys string   Override the key sequence for detaching a container
  -e, --env list             Set environment variables
      --env-file list        Read in a file of environment variables
  -i, --interactive          Keep STDIN open even if not attached
      --privileged           Give extended privileges to the command
  -t, --tty                  Allocate a pseudo-TTY
  -u, --user string          Username or UID (format: <name|uid>[:<group|gid>])
  -w, --workdir string       Working directory inside the container
# -it,开启一个交互式的终端进入容器里边,运行/bin/bash
fmy@dockerserever:~$ sudo docker exec -it fan-nginx-1 /bin/bash
root@c0fe3a59a022:/# 
root@c0fe3a59a022:/# hostname  # dockers的主机名字,其实就是它的id
c0fe3a59a022
root@c0fe3a59a022:/# cat /etc/issue  # docker的系统
Debian GNU/Linux 11 \n \l

  对docker容器里边的nginx做修改

root@c0fe3a59a022:/# cd /usr/share/nginx/html
root@c0fe3a59a022:/usr/share/nginx/html# ls
50x.html  index.html
root@c0fe3a59a022:/usr/share/nginx/html# echo "hello my friends "  >> index.html 

 

这里要注意,你要使用你的“IP地址 :  这个docker占用的端口号”才能够访问你自己网站。

问题:容器运行的时候是启动了一个进程,那么关掉容器再启动的时候,我们输入的"hello my friends"还会存在吗?进程是在内存中的,我们关掉之后,会不会把内容存到我们的磁盘中,再次启动的时候,是否会把磁盘中的内容加载到内存中?

答案:会的存在的。当你对容器里边的东西做了修改之后,你把容器停掉,系统会把你的修改数据保存到相关的磁盘的某个目录中去的。

1.6.1、进入容器之后,很多命令不可以使用

root@c0fe3a59a022:/# ls
bin   dev		   docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc			 lib   media  opt  root  sbin  sys  usr
root@c0fe3a59a022:/# ip add
bash: ip: command not found

因为容器里边运行的镜像,是一个浓缩版的镜像,是一个基础的系统,有很多没有安装的程序。里边的系统跟我们外边的操作系统关系不是很大,比如,我们外边运行的是"Ubuntu",但是里边运行的是"Debian"。因为里边很多软件并没有安装,所以没有"ip add'等其他命令也很正常。若是我们需要这些命令,我们可以进行手动安装,但是建议不要这么做。因为这不符合容器的单进程思想,即一个容器里只跑一个关键的进程。

1.7、启动MySQL容器

参考国内网站:​​​​​​Hub · DaoCloud

参考docker官方网站: Docker Hub

1.7.1、在Ubuntu里启动MySQL

fmy@dockerserever:~$ sudo docker pull mysql:5.7.35  # 安装MySQL容器
# 若是没有指定端口号映射,那么就默认3306端口。这里没有映射所以访问不能用正常的方法。
fmy@dockerserever:~$ sudo docker run --name fan-mysql-1 -e MYSQL_ROOT_PASSWORD='f123456' -d -p 3306:3306 mysql:5.7.35   # 访问本机的3306端口就映射到容器的3306端口;-d,是放在后台运行
594962d85308743234adce2aae03d160ca558e5cbcdbb4b119a1e4d9a562fd0d

#在访问之前,我们若是我们centos或者Ubuntu系统上运行这个MySQL,需要把系统上的MySQL关闭。不然会提示端口已经被占用

fmy@dockerserever:~$ sudo docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS                                                  NAMES
594962d85308   mysql:5.7.35   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   fan-mysql-1

MySQL启动之后,要去安装一个mariadb(安装这个是为了获得MySQL命令):

Ubuntu:apt install mariadb-server(Ubuntu中安装这个,两个端都有了)

centos:yum install mariadb  mariadb-server

在centos中mariadb(客户端的软件包)和 mariadb-serve(服务器的软件包,另外centos8里边不需要安装这个server的软件包)

🍓[访问MySQL]🍓

# 默认情况下连接的是文件sock,而我们docker是通过IP地址去映射的。
fmy@dockerserever:~$ sudo mysql -uroot -pf123456
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2)


fmy@dockerserever:~$  sudo mysql -uroot -pf123456 -h 192.168.29.132  # 指定连接服务器的IP地址
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.35 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> 

1.7.2、在centos里启动MySQL

第一步:在宿主机上安装mariadb的客户端软件,获得MySQL命令

[root@localhost ~]# yum install mariadb

第二步: 启动MySQL容器

[root@localhost ~]# docker run --name fan-mysql-1 -e MYSQL_ROOT_PASSWORD='f123456' -d -p 3306:3306 mysql:5.7.35
17fd266ec3a6298dfc15063358270c7eaf4b008258124e0d8b50f17c3e589eca
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
17fd266ec3a6   mysql:5.7.35   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   fan-mysql-1

第三步:访问MySQL 

你可以本机访问也可以从别的机器上访问


这是从别的机器上连接另一台机器的MySQL

若是连接本地的MySQL就不需要-h + IP地址 

1.7.3、区别MySQL是宿主机的还是容器的的方法

# 这就是docker起的MySQL
root@dockerserever:/home/fmy# ss -anplut|grep 3306
tcp   LISTEN 0      4096                0.0.0.0:3306      0.0.0.0:*    users:(("docker-proxy",pid=5369,fd=4))   
tcp   LISTEN 0      4096                   [::]:3306         [::]:*    users:(("docker-proxy",pid=5375,fd=4))   

root@dockerserever:/home/fmy# ps aux|grep mysqld
systemd+    5410  0.0  5.0 1377308 199392 ?      Ssl  06:58   0:12 mysqld
root       12203  0.0  0.0   6548  2348 pts/0    S+   10:53   0:00 grep --color=auto mysqld


# 这就是宿主机的MySQL
[root@localhost ~]# service mariadb start
[root@localhost ~]# ps aux|grep mysqld
mysql      4411  1.0  4.3 968920 80804 ?        Sl   18:58   0:00 /usr/libexec/mysqld --bas=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mab/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root       4447  0.0  0.0 112824   980 pts/1    S+   18:58   0:00 grep --color=auto mysql

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost ~]# ss -anplut|grep 3306
tcp    LISTEN     0      50        *:3306                  *:*                   users:(("mysqld",pid=4411,fd=14))

1.8、docker create

root@dockerserever:/home/fmy# docker create --name nginx-yao-1  -p 7788:80  nginx
fd65ab2f6bcd176dff405dce181b4b2ebb423f3c0922004d38c27b783fb7ad36
root@dockerserever:/home/fmy# docker ps -a|grep yao
fd65ab2f6bcd   nginx          "/docker-entrypoint.…"   31 seconds ago   Created                                                                         nginx-yao-1
root@dockerserever:/home/fmy# docker start nginx-yao-1
nginx-yao-1
root@dockerserever:/home/fmy# docker ps |grep yao 
fd65ab2f6bcd   nginx          "/docker-entrypoint.…"   2 minutes ago   Up 17 seconds   0.0.0.0:7788->80/tcp, :::7788->80/tcp                  nginx-yao-1

1.9、docker container inspect + 容器名字

查看容器的详细信息

root@dockerserever:/home/fmy# docker container inspect nginx-yao-1
root@dockerserever:/home/fmy# docker container inspect nginx-yao-1|grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",

1.9.1、 为什么容器也有IP地址呢?

这些容器相当于宿主机的内网,宿主机会有一个docker0的网卡,所以会给每一个容器都分配一个内网IP地址。 

root@dockerserever:/home/fmy# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:c1:d9:eb brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.29.132/24 brd 192.168.29.255 scope global dynamic ens33
       valid_lft 1603sec preferred_lft 1603sec
    inet6 fe80::20c:29ff:fec1:d9eb/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ae:e7:58:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:aeff:fee7:5899/64 scope link 
       valid_lft forever preferred_lft forever
9: vethb946298@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 46:08:52:bb:70:11 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::4408:52ff:febb:7011/64 scope link 
       valid_lft forever preferred_lft forever
11: vethc7efec8@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether ea:a2:08:3b:cc:a6 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::e8a2:8ff:fe3b:cca6/64 scope link 
       valid_lft forever preferred_lft forever

 

1.9.2、 run一个容器的时候,加"-p"映射端口会发生一些什么变化?

会在docker的iptables规则里添加SNAT和DNAT

[root@centos7-docker ~]# docker run -it  -d --name test -p 9999:90 centos/python-35-centos7 /bin/bash
ea86b5a468819752a3a6ec038bf2489e8d072a5246980f243f9d4ef17f6eafb1
[root@centos7-docker ~]# docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS          PORTS                                             NAMES
ea86b5a46881   centos/python-35-centos7   "container-entrypoin…"   5 seconds ago    Up 3 seconds    8080/tcp, 0.0.0.0:9999->90/tcp, :::9999->90/tcp   test
[root@centos7-docker ~]# iptables -n -t nat -L
...  这里代表一些省略的内容
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
POSTROUTING_direct  all  --  0.0.0.0/0            0.0.0.0/0           
POSTROUTING_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0           
POSTROUTING_ZONES  all  --  0.0.0.0/0            0.0.0.0/0           
MASQUERADE  tcp  --  172.17.0.3           172.17.0.3           tcp dpt:90

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9999 to:172.17.0.3:90
...


# 这个是没有加-p的
[root@centos7-docker ~]# docker run -it  -d --name test0  centos/python-35-centos7 /bin/bash
39c0d0500d14583e82062fe1a676a4f5f30e7cf65e48c1a369c74e4cdcbfffb7

1.9.3、docker容器上网的问题

在宿主机开启了路由和能够上网的前提下,容器才能够上网。

1.9.4、用docker里的centos镜像下载tree和vim命令

这个需要我们切换centos的root用户才能使用这个命令;但是这个centos/python-35-centos7这个版本不会默认就切换到root用户,但是我也不知道切换root用户的密码。

所以你们可以用"centos:7"这个镜像来运行docker容器,这个默认出来就是使用root用户,如上图。

1.10、dockers rmi + 镜像名字

删除不需要的镜像

[root@centos7-docker ~]# docker images
REPOSITORY                 TAG       IMAGE ID       CREATED         SIZE
mysql                      latest    667ee8fb158e   2 weeks ago     521MB
redis                      latest    bba24acba395   2 weeks ago     113MB
mysql                      5.7.35    8a8a506ccfdc   6 months ago    448MB
hello-world                latest    feb5d9fea6a5   6 months ago    13.3kB
daocloud.io/nginx          latest    6084105296a9   13 months ago   133MB
centos/python-35-centos7   latest    2db34dda8fd8   3 years ago     645MB
[root@centos7-docker ~]# docker rmi mysql:latest
Untagged: mysql:latest
Untagged: mysql@sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195
Deleted: sha256:667ee8fb158e365450fc3f09712208fe44e9f1364a9b130fed95f3f4862f8a63
Deleted: sha256:daba3b5cd1b725f259d5d59049c7011f6a20f2e7e4782b873cadeedbc1a4f122
Deleted: sha256:407a68a397de3c8e4da2ccd388f27c795519414cc9319f674e7b9a492cd8514b
Deleted: sha256:6967db79cb8031d7e505dd82c91c6426e84c6ad2098d06c1c090485886bc1c63
Deleted: sha256:3dcc0f922d11309b2e4870d5f42c5005f086c9b9c1e128ed2b712b65fa79a5c9
Deleted: sha256:ae5d4ab2734d5c27069212b2690dc2c7ac4cd85ee5e122607cb175f7fe908914
Deleted: sha256:610784bcaae50e999566928bdec7a4e146fe075d9e487bde0a228c99013ff1d9
Deleted: sha256:ccebaff04ea21a9e2df07f9d5af5c47ccd141cd3590f4d45784b6075e7c17ded
Deleted: sha256:716203221cd982fc07b80efda0c53a759ecfd69b2d93d4e8adf5fa094351372e
Deleted: sha256:fbd4939b3eb58642a07003e076acc3d0d8140797f61139ce4d3645790d9c8b51
Deleted: sha256:88f8458b4b2030b229b9757bd4061bce58b65e831a0bba8fa71aa8b3f87db630
Deleted: sha256:f2f431ab3ddc1460d300cd86016cc03b7611b56f04bd88370da3d378b3d10aea
Deleted: sha256:c1065d45b8722a4385f2ee26116e1859e8083400ee00d2beff3fdd5225bfeee9
[root@centos7-docker ~]# docker images
REPOSITORY                 TAG       IMAGE ID       CREATED         SIZE
redis                      latest    bba24acba395   2 weeks ago     113MB
mysql                      5.7.35    8a8a506ccfdc   6 months ago    448MB
hello-world                latest    feb5d9fea6a5   6 months ago    13.3kB
daocloud.io/nginx          latest    6084105296a9   13 months ago   133MB
centos/python-35-centos7   latest    2db34dda8fd8   3 years ago     645MB

1.11、限制容器可以使用的cpu和内存资源

[root@centos7-docker ~]# docker run -it --cpu-shares 30 -m 100000000 -d --name test1 centos/python-35-centos7
6d30a71bc0d1d2915c9799db95821bf7614014e50d037363f6528f975bfce230
"""
--cpu-shares 30,限制使用cpu。另外不管你有多少核心,都是看做一个整体来计算,都是按照你制定的比例分配资源的。这个资源是消耗docker的资源。当你的docker里有一个容器,那么他也可以占满cpu。但是若是出现一个容器分配60的权重。那么test1最多只能消耗1/3的资源。
-m 100000000,限制使用内存 单位是byte
    --memory bytes
"""
[root@centos7-docker ~]# docker container inspect test1|egrep "CpuShares|Memory"
            "CpuShares": 30,  # 这里是cpu
            "Memory": 100000000,  # 这里是内存
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 200000000,
            "MemorySwappiness": null,

1.11.1 、OOM的面试问题

如何限制一个进程可以使用多少cpu和多少内存?

创建一个容器,让这个进程在容器里run,这样可以限制容器所使用的cpu和内存,从而达到限制这个进程的cpu和内存的使用

2、容器的状态

  • up 
  • created
  • exited

3、访问MySQL的方式

3.1、使用mysql.socket文件去连接

这个文件是用来连接mysqld和mysql的,是他们的桥梁。也表示着进程与进程之间的通信方式。但是文件sock只能实现同一台机器上的不同的进程之间的通信。

[root@localhost ~]# mysql -uroot -p  # 若是在本机,直接使用密码登入。若是开始是直接下载且没有设置密码的,那么密码为空。
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> Bye
[root@localhost ~]# cd /var/lib/mysql
[root@localhost mysql]# ls
aria_log.00000001  ibdata1      ib_logfile1  mysql.sock          test
aria_log_control   ib_logfile0  mysql        performance_schema

# 关闭mariadb后,sock文件没有了。
[root@localhost mysql]# service mariadb stop
Redirecting to /bin/systemctl stop mariadb.service
[root@localhost mysql]# ls
aria_log.00000001  ibdata1      ib_logfile1  performance_schema
aria_log_control   ib_logfile0  mysql        test
[root@localhost mysql]# mysql -uroot -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

3.2、通过网络socket

网络socket是(ip:port);可以实现不同的机器上的不同的进程之间的通信。例如,连接MySQL的时候,若是不接端口的时候,默认的就是3306端口。

我们在192.168.29.132这个IP机器里打开docker的mysql,在192.168.29.131这个IP机器里连接132的MySQL。

[root@localhost mysql]# mysql -uroot -p -h 192.168.29.132
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.35 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> 

若是长时间连接不到容器里,我们需要把132这个docker里的容器重启一下。命令为:

service docker restart

3.2.1、docker服务重启

若是docker服务重启,那么docker容器不会重启,会全部关闭。

3.2.2、docker重启和清楚防火墙规则的顺序

要先清除防火墙规则,然后启动docker。因为启动docker的时候,docker会到iptables里添加自定义规则,这个规则是保障容器之间的通信和上网使用。

4、内存溢出(oom,out of memory)

正常来说,进程的内存溢出,内核就会把这个进程杀掉。

[root@centos7-docker ~]# docker container inspect test1|egrep "OomKillDisable"
            "OomKillDisable": false,  # 这个是false的时候,溢出的时候容器会被杀掉;当true时,溢出的时候容器会被挂起。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐