搜索images中包含mysql的镜像

1
docker search mysql

获取mysql镜像,且指定其tag为5.7.22

1
docker pull mysql:5.7.22

查看当前已pull的本地的images(镜像)

1
docker images

运行一个mysql容器,将容器的3306端口映射到本机的3308端口

-d: Run container in background and print container ID

-p: Publish a container’s port(s) to the host

-e: Set environment variables

–name string: Assign a name to the container

1
docker run --name dev2-mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=my_db -p 3000:3000 -d mysql:5.7.22

若容器没有运行起来,或者运行结果和期望的不一致,可以查看下log记录

logs后面可以是容器名称或者容器id

1
docker logs dev2-mysql

通过执行bash登录dev2-mysql容器

-i: Keep STDIN open even if not attached

-t: Allocate a pseudo-TTY,

1
docker exec -it dev2-mysql bash

列出所有容器

1
docker ps -a

停止、删除容器

1
2
docker stop dev2-mysql
docker rm dev2-mysql

运行容器并将一个本地目录映射到容器中。

-v: Bind mount a volume

1
docker run -d --name mynginx -p 8080:80 -v /d/ysp:/usr/share/nginx nginx

查看当前运行中的容器占用的系统资源

–no-stream: Disable streaming stats and only pull the first result

1
docker stats --no-stream

根据DockerFile文件创建一个镜像,注意最后有个“.”

-t: Name and optionally a tag in the ‘name:tag’ format

1
docker build -t dao-2048 .

查看构成一个mysql镜像的所有的镜像层(包括每一层镜像的大小和形成该层镜像的命令)

Dockerfile的每一行代码都会形成一个镜像层

1
docker history mysql

有个坑,关于-v挂载目录。

下面这行代码启动的容器,启动后一分钟内就会自动stop,后面经过尝试,发现是挂载到/usr/share的原因,该文件夹是已经存在且包含了许多文件的,挂载到该目录导致出错了,改为/usr/share/work就好了,docker会自动新建work文件夹。

1
docker run --name mysql -v /d/work:/usr/share ...后面省略

查看一个docker容器或镜像的信息(Return low-level information on Docker objects)

1
docker inspect mynginx

关于用Dockerfile初始化mysql数据的坑

Dockerfile中没有定义CMD的时候,mysql会自动启动,定义了CMD的时候,mysql需要用自己用命令启动————这个是我尝试了好久才得出来的结论。
也就是说,如果自己的Dockerfile没有定义CMD,FROM的镜像的Dockerfile中的CMD会被调用,而因为镜像中包含了mysql,CMD命令中一般都会写好它的启动命令。
也就是说,假如我的Dockerfile写了CMD命令,其中就必须包含有启动数据库的命令,否则数据库没起来,就像我一样,懵逼老久。
数据库启动命令根据不同版本有所不同,我找到了以下两种不同的命令,我使用的是ubuntu下的mysql:5.7.22,启动命令为版本一的:

1
2
3
4
5
6
7
# 版本一
chown -R mysql:mysql /var/lib/mysql
mysqld --user=mysql &
# 版本二
chown -R mysql:mysql /var/lib/mysql
mysql_install_db --user=mysql > /dev/null
mysqld_safe --user=mysql &