总结一些Docker的常用的命令和一些用法,持续补充更新;这里以mysql镜像为例
1.拉取镜像
docker pull mysql
默认会拉取最新的;如果要获取指定的镜像,在后面指定tag的名称;
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
2.查看所有运行中的容器
docker ps
3.查看所有的容器,包括未运行的
docker ps -a
4.运行一个mysql容器
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
参数说明:
--name :指定容器的别名是mysql,可以起别的名字;
-p 3306:3306 表示在这个容器中使用3306端口(第二个)映射到本机的端口号也是3306(第一个)
MYSQL_ROOT_PASSWORD 初始设置root用户的密码;
最后一个mysql是镜像的名字,这里用上面拉取的mysql来运行容器;
-d 表示detached,意味着执行完这句命令后,控制台不会被阻塞,可继续执行命令;
5.启动一个容器,当容器创建成功后,下次启动,可以直接通过start命令来启动
docker start mysql
6.停止一个容器,停止容器使用stop命令
docker stop mysql
7.删除一个容器,当一个容器不需要了可以通过rm命令来删除
docker rm yemanren_phototutorial-mysql_1
8.删除所有容器
为了演示我们再创建一个mysql容器,注意不要同一个3306,端口已经被上一个3306端口占用了,会出现如下错误提示;
我们使用之前的创建容器命令,使用3309端口来创建一个mysql,容器名字为new-mysql-container
docker run --name new-mysql-container -p 3309:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
通过docker ps可以发现,已经有两个mysql的容器了;如图所示
现在要删除所有容器,使用命令
docker rm $(docker ps -a -q)
注意,删除所有容器之前,必须停止所有的容器,否则删除失败;这里的 -a 标识列出所有的容器,-q标识只列出容器的id,然后传递给rm命令,依次删除容器;要删除一个正在运行的容器可以使用docker rm -f 来删除;
9.登录容器
docker exec -it new-mysql-container bash
运行中的容器其实一个功能完备的Linux操作系统,可以像常规的系统一样登录并访问容器;还可以使用exit命令退出登录
10.进入mysql之后,登录进去
mysql -u root -p
输入密码之后就可以进行数据库的一些操作了;
要退出mysql的操作,使用
这里,mysql最新的版本不知道为啥,intellij无法连接上去,后来使用mysql:5.7.20的镜像就可以连接上去;
11.删除镜像
docker rmi -f 99eb457f8a8e
12.提交镜像
对某个镜像做了一些操作需要commit 才能保存下来;
docker commit ubuntu ubuntu:dev
前面是镜像名称,后面是新的镜像的repository和tag;
13.运行容器并指定映射端口和文件
docker run -t -d -p 8080:8080/tcp --name dev -v /adademy/:/work 169efd55624a
最后的参数是镜像的id,也可以改成镜像的名称;
注意:windows中的docker进行挂载的时候只能挂载C:\Users 下的目录,其他的是无法挂载的;
docker run -t -d -p 6379:6379 --name redis_container -v /c/Users/:/work redis
上面的命令以redis为镜像,创建了一个容器,名称是redis_container;同时将本地的c:Users目录映射为容器中的work目录;
14.导出镜像
docker save 镜像名称 > 镜像名称.tar //比如镜像为demo,打包命令 docker save demo > demo.tar
15.导入镜像
一般是镜像本地导出之后,上传到服务器上,之后再服务器上导入进去,使用load命令进行导入,如下所示
docker load < demo.tar
如果本地之前存在demo的镜像,那么它会覆盖掉之前的镜像
16.docker-compose 启动镜像
docker-compose -f app.yml up -d
注意,1.该命令会检测镜像是否发生了变化,假设app.yml中有两个镜像一个mysql,一个你的应用镜像比如demo,如果你重新导入了demo镜像,那么通过这个命令去起的时候,mysql是不会重启的,只有demo容器会重启,使用最新的镜像;2.docker中的容器默认是在一个网络里面,通信的时候使用的是容器的端口,比如app.yml中mysql的端口为
那么demo去连接mysql的时候使用的端口是3306而不是3396,3396端口是宿主机去连接的时候使用的端口;
17.启动docker服务
service docker start
18.以root身份进入docker容器中
docker exec -u root -it 容器名 /bin/bash
19.Springboot应用中配置mysql的用户名密码
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=abcde
mysql.yml中配置mysql的数据库账户密码
environment:
- MYSQL_USER=root
- MYSQL_ROOT_PASSWORD=abcde
- MYSQL_DATABASE=mixweb
20.创建容器不启动
docker create <image_name:tag>
创建容器,但是不启动,可以在此基础上对容器的镜像做一些修改之后提交成一个新的镜像;
21.容器拷贝文件
docker cp <container_id>:/var/lib/tcc/lib/xxx.jar ./
拷贝容器中的jar包到当前的路径下;之后就可以对jar包做各种的编辑;比如更新下svg图片
jar -uf ./xxx.jar ./BOOT-INF/classes/static/assets/images/logo.svg
然后可以讲新的jar拷贝到容器中;
docker cp ./xxx.jar <container_id>:/var/lib/xxx/lib/xxx.jar
之后提交
docker commit <container_id> <docker_repo/tcc_new_image_name:new_tag>
最后清理创建的容器
docker rm <container_id>