Docker安装及启动的踩坑记录

简介

Docker是一个开源的应用容器引擎
Docker支持将软件编译成一个镜像,然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像
运行中的这个镜像称为容器,容器启动时非常迅速的。

核心概念:

  • docker主机(Host):安装了docker程序的机器(Docker直接安装在操作系统之上的)
  • docker客户端(Client):链接docker主机进行操作的 docker仓库(Registry):用来保存各种打包好的软件镜像
  • docker镜像(Images):软件打包好的镜像,放在仓库中
  • docker容器(Container):镜像启动后的示例成为一个容器,容器是独立运行的一个或一组应用

创建步骤:

  1. 安装好docker
  2. 去docker仓库找到软件对应的镜像
  3. 直接使用docker运行这个镜像这个镜像就会生成一个docker容器
  4. 对容器的启动停止就是对软件的启动停止

docker安装(在linux上)

在linux上安装docker比较简单,正常情况下只需要使用yum命令即可,但有几点需要注意一下:
有些教程写安装docker使用:

yum install docker

但亲测发现,使用该命令下载后,docker无法启动,故需要使用:

yum -y install docker-io

这里可能会发生报错:

No package docker-io available.
错误:无须任何处理

表示yum没有找到docker包,有其他教程说使用yum install epel-release更新库即可,我在安装时,执行yum install docker前用这个命令可以下载,但我们之前说了,下载docker是没有办法启动的,执行yum -y install docker-io时,更新库的办法是无效的。
所以应该使用下载源安装的方式:

yum install https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm

等待install成功即可,到此,docker已安装成功。

启动docker(as6)
service docker start
docker常用命令:
docker search 查询镜像
docker pull 下载镜像
docker images 查看镜像
docker rmi images-id 删除镜像
下面以mysql为例讲解如何安装

首先先查询一下可用的mysql:

[root@Centos6x64 ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relati...   9444      [OK]       
mariadb                           MariaDB is a community-developed fork of M...   3404      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Crea...   691                  [OK]
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   75                   
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. ...   67                   
centurylink/mysql                 Image containing mysql. Optimized to be li...   61                   [OK]
deitch/mysql-backup               REPLACED! Please use http://hub.docker.com...   41                   [OK]
bitnami/mysql                     Bitnami MySQL Docker Image                      39                   [OK]
tutum/mysql                       Base docker image to run a MySQL database ...   35                   
schickling/mysql-backup-s3        Backup MySQL to S3 (supports periodic back...   29                   [OK]
prom/mysqld-exporter                                                              27                   [OK]
linuxserver/mysql                 A Mysql container, brought to you by Linux...   25                   
centos/mysql-56-centos7           MySQL 5.6 SQL database server                   19                   
circleci/mysql                    MySQL is a widely used, open-source relati...   19                   
databack/mysql-backup             Back up mysql databases to... anywhere!         17                   
mysql/mysql-router                MySQL Router provides transparent routing ...   15                   
arey/mysql-client                 Run a MySQL client from a docker container      14                   [OK]
openshift/mysql-55-centos7        DEPRECATED: A Centos7 based MySQL v5.5 ima...   6                    
fradelg/mysql-cron-backup         MySQL/MariaDB database backup using cron t...   6                    [OK]
genschsa/mysql-employees          MySQL Employee Sample Database                  5                    [OK]
devilbox/mysql                    Retagged MySQL, MariaDB and PerconaDB offi...   3                    
ansibleplaybookbundle/mysql-apb   An APB which deploys RHSCL MySQL                2                    [OK]
jelastic/mysql                    An image of the MySQL database server main...   1                    
widdpim/mysql-client              Dockerized MySQL Client (5.7) including Cu...   0                    [OK]
monasca/mysql-init                A minimal decoupled init container for mysql    0                    

使用pull命令下载mysql(默认下载latest版本):

[root@Centos6x64 ~]# docker pull mysql
latest: Pulling from mysql
e621dc7f5dcb: Pull complete 
6cb216111959: Pull complete 
798af5f94c76: Pull complete 
899cc754e057: Pull complete 
d58981144711: Pull complete 
d5f06b6846af: Downloading [=====>                                             ] 155.7 kB/1.419 MB
8e66e8171818: Download complete 
d30a7c52f60f: Downloading [=========>                                         ] 2.636 MB/13.44 MB
9e206409df13: Download complete 
65f574158b71: Download complete 
8a15c0e8d158: Download complete 
18e73f1a0980: Download complete 
d1f89aeaee69: Downloading [=========>                                         ] 20.95 MB/111.5 MB
d1f89aeaee69: Downloading [=========>                                         ] 21.49 MB/111.5 MB
b369d870a220: Download complete 
53b1039660ef: Download complete 
a611cdbfc577: Download complete 
f7c1ee13f2c9: Download complete 
832fb4feff47: Download complete 
642c6f7a4262: Download complete 

下载正常结束后,使用docker images查看已经下载好的镜像:

[root@Centos6x64 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
mysql               latest              642c6f7a4262        4 days ago          540.6 MB
tomcat              latest              052a153114e9        7 days ago          647.2 MB

镜像下载至此就完成了,没什么意外的话就可以启动了。
我第一次启动的时候遇到了一点小问题,在这里也一起分享下,避免大家一起踩坑。
启动镜像使用docker run命令,当然,具体参数查文档会更方便一点,我这里主要是分享一下踩坑经验。我执行了下面的语句来启动镜像:

[root@Centos6x64 ~]# docker run --name mysql01 -d mysql
8c9da563fd79a331c7076db1a2a34e33eb4b5a8fbca74ddd77f14a32decc02db

看起来好像启动成功了,然鹅并没有,我们可以用docker ps查询一下

[root@Centos6x64 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

正常情况下,docker ps命令会列出启动成功的镜像,但我们发现上面的执行结果什么都没有,再用docker ps -a查看一下

[root@Centos6x64 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS                           PORTS                    NAMES
8c9da563fd79        mysql               "docker-entrypoint.s   About a minute ago   Exited (1) About a minute ago                             mysql01  

很显然,启动失败了,这时候,可以根据启动命令时返回的id查询一下对应的log

FATAL: kernel too old

这个报错是指我们的内核版本太老了…得升级,于是执行了下面的这一堆:

#更新nss(网络安全服务)
yum -y update nss
#升级内核需要elrepo的yum源,所以安装其源时,先导入elrepo的key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
#安装elrepo源lt内核
yum --enablerepo=elrepo-kernel -y install kernel-lt
#修改/etc/grub.conf文件,将default=1修改成default=0
vi /etc/grub.conf
#保存退出重启
reboot

再查看内核,发现版本已经变了uname -r

这下应该可以了吧,然鹅,ps之后还是什么都没有,再次查看日志发现

[root@Centos6x64 ~]# docker logs 8c9da563fd79a331c7076db1a2a34e33eb4b5a8fbca74ddd77f14a32decc02db
2020-05-02 02:27:54+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.20-1debian10 started.
2020-05-02 02:27:54+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-05-02 02:27:54+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.20-1debian10 started.
2020-05-02 02:27:54+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
        You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

这个意思是我们要在启动的时候指定password,可以去官方找一下启动mysql的正确姿势,我这里直接贴一下我的启动命令:

docker run -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

当然也可以指定一下编码:

docker run -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

执行完上述命令,再用ps查看,终于启动起来了,可喜可贺

[root@Centos6x64 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                               NAMES
b6bf2579d086        mysql               "docker-entrypoint.s   6 seconds ago       Up 5 seconds        33060/tcp, 0.0.0.0:3306->3306/tcp   mysql01             

启动成功之后,就可以用你的mysql客户端根据你自己设置的端口和密码连接这个mysql了,不过别忘了防火墙哦~~
其他一些命令,大概没什么坑,我就贴一下,你懂就好:

  1. docker stop +(名字或id都可以即 mysql01或者b6bf2579d086)停止运行中的容器
  2. 启动容器 docker start 容器id(b6bf2579d086)run一次之后,后面就用start启动我们之前创建过的容器
  3. 删除容器 docker rm id(注意和docker rmi区分)
  4. 启动一个做了端口映射的tomcat docker run -d -p 8888:8080 tomcat -d表示后台运行 -p将主机端口映射到容器的一个端口
  5. 可以启动多个tomcat,改一下端口映射即可,即不能同一个端口对应多个tomcat端口

希望我上面踩的坑对你有所帮助~~

你可能感兴趣的:(Docker安装及启动的踩坑记录)