0%

Docker 学习笔记


Docker 学习笔记

使用动机

Docker 容器是一种轻量级的应用部署、运行单元,历经几代发展,今天发现Windows 10 家庭版不再需要依赖Visualbox,只要安装好WSL即可使用,启动和运行均非常便捷,因此想把学习使用的经历记录下来,以便后续回顾。

目标是在本地建立开发所需要的各种依赖,使用最省的资源,提升开发效率。

基本使用命令

搜寻镜像

docker search –no-trunc xxx

no-trunc 的选项可以不截断结果中的文字。比如Description过长,默认会被截断。

下载镜像

docker pull image-name

列举本地镜像

docker image ls

运行镜像

1
2
3
docker run --itd --name *name_of_a_new_container*  -p6379:6379 *image_name* 
#-d表示后台运行
#-p本地映射端口:远程端口

-p端口映射相应说明可以参考这个网站

如果遇到运行时报名字冲突,证明已经创建过相应名字的容器了。此时需要通过start启动容器

1
docker start -a image_name #-a指attach到stdin/stderr,可以在命令行中看到连接后的容器输出

停止docker镜像

1
docker stop image_name

docker rm image_name 删除掉容器,再重建。

查询当前运行的镜像

docker ps 显示运行的镜像

显示所有已经创建的镜像

1
docker ps -a

实战

运行一个redis容器

1
2
3
4
5
$docker pull redis
$docker run -d --name redis-test -p 6379:6379 redis
$docker exec -it redis-test /bin/bash
$root@878972df>redis-cli
#:D

可以通过如下命令看本机端口是不是被打开(状态为LISTENING,windows环境)

1
netstat -na | find "6379"

可以尝试通过redis客户端或者telnet操作下redis

1
telnet localhost 6379 #quit命令退出

运行一个Mysql 容器

mysql容器运行方法与redis大同小异,如果启动失败,比如通过 docker ps -a看到异常终止,则可通过如下命令查看日志:

1
docker logs container_name

比如,我运行mysql失败,产生了如下日志:

2020-12-02 16:14:17+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.22-1debian10 started.
2020-12-02 16:14:17+00:00 [Note] [Entrypoint]: Switching to dedicated user ‘mysql’
2020-12-02 16:14:17+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.22-1debian10 started.
2020-12-02 16:14:17+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

显然,需要提供更多参数以便运行mysql,如日志所述,可以运行如下命令设置一个root密码

1
docker run --name=mysql_server -e MYSQL_ROOT_PASSWORD=12345 -p3306:3306 -p33060:33060 -d mysql

之后,即可通过如下命令登录容器。

3306是经典的mysql端口,其他可用端口可以参考如下链接Mysql Ports Reference

1
2
3
4
5
docker -it mysql_server /bin/bash


----
root@wejfio22> mysql -uroot -p #打开一个mysql shell

今日遗留问题

  • 如何改变容器中的配置,比如更改redis的默认运行port?
  • 数据在容器停止时似乎没有丢失,如果是容器意外退出呢?
  • 已经创建的容器,如果需要改变本地映射端口,应该怎么做?

Welcome to my other publishing channels