docker自学入门

0 . 基础命令

  1. 查看镜像 docker images

  2. 查看运行的容器 docker ps

  3. 启动一个镜像 docker run --name hello-world -d hello-world:latest

    //启动redis时候 指定redis.conf文件
    docker run 
    -p 6379:6379
    --name redis 
    -v /etc/redis/redis.conf:/etc/redis/redis.conf 
    -d redis redis-server /etc/redis/redis.conf --appendonly yes
    
    //启动mysql
    docker run -d 
    -p 3306:3306 
    --name mysql5.7 
    -v /devtools/mysqldata/log:/var/log/mysql  
    -v /devtools/mysqldata/data:/var/lib/mysql  
    -v /devtools/mysqldata/conf:/etc/mysql 
    -e MYSQL_ROOT_PASSWORD=root mysql:5.7
    
  4. 关闭运行中的容器 docker stop [name]

  5. 重新启动关闭的容器 docker start [name]

  6. 连接容器中运行redis镜像 docker exec -it redis redis-cli

  7. 连接容器中 1. docker exec -it mysql bash 2. mysql -uroot -proot 3. Ctrl d 退出 exit 退出
    [图片]

  8. 删除容器 docker rm [name] 运行中的不可以删除

  9. 下载镜像: 在docker官方镜像仓库中搜索需要安装的镜像,地址https://hub.docker.com/
    以下载mysql为例:
    此命令下载的是最新版
    docker pull mysql
    此命令下载的是指定版本的
    docker pull mysql:5.7

  10. 修改容器名称:docker rename [originName] [newName]

  11. 部署可执行jar
    参考:https://blog.csdn.net/leftfist/article/details/123510744
    基础知识:
    我们构建的是运行bash文件命令的镜像,而不是构建jar包的镜像。好处就是,jar包有更新,只需替换jar包或者bash文件,而无须重新构建镜像。
    通常,用docker承载运行java程序,是将jar包先构建镜像,然后创建docker容器运行。如果jar包更新,就需要删除原镜像,重新来一遍,耗时耗力。有一个方案是,我们创建一个bash文件(linux的批处理文件),其内容是运行我们的jar包。然后创建运行该bash文件的docker镜像、docker容器。这样的好处是很明显的,jar包有更新,只替换jar包,甚至jar包改名了,也只是更改bash文件的内容而已,而镜像、容器,不会受到任何影响,无需作出任何改动。
    思路梳理:
    1、将docker容器中的指定文件夹挂载到宿主机上,更新jar包只需上传到宿主机指定路径,方便更新
    2、利用bash文件运行jar包,并构建该bash的镜像,代替构建直接运行jar包的镜像,利于镜像与jar包解耦。
    例如,app-1.0.0.jar 升级到 app-2.0.0.jar,只须更改bash文件的内容,而无须构建新的镜像。
    准备工作:
    1、创建存放docker配置文件、jar包的文件夹
    在宿主机上,创建文件夹, 用于存放bash文件和jar包。然后在该文件夹下,创建bash文件和容器配置文件
    mkdir /home/liui/app,
    2、创建bash文件
    vi run.sh
    java -jar /usr/data/app-1.0.0.jar
    /usr/data是docker容器内的路径
    我们不必真的到容器内创建这个路径
    后面会将此路径挂载到当前文件夹:/home/admin/app
    3、创建容器配置文件

    vi Dockerfile
    
    FROM openjdk:8-jdk-alpine
    EXPOSE 8081
    ENTRYPOINT ["sh","/usr/data/run.sh"]
    

    8081是我们这个jar包的对外端口
    最后一句,有网上教程写的是 CMD [“sh”,“-c”,“/usr/data/hello.sh”],
    但不知道为什么,我这样写的话,容器运行后会提示没有权限!
    4、构建镜像
    仍然在/home/liui/app下,构建镜像。注意最后一个“.”,表示 Dockerfile 文件在当前目录下。
    docker build -t myapp:1.0.0 .
    [图片]
    5 、创建容器并运行
    docker run -d -it --name myapp -p 8081:8081 -v /home/liui/app:/usr/data myapp:1.0.0
    docker引擎重启后自动运行(也可以理解为操作系统重启后自动运行,如果docker是开机自动运行的话)
    docker run --restart=always -d -it --name=myapp -p 8082:8081 -v /home/liui/app:/usr/data myapp:1.0.0
    -v,将容器内的/usr/data挂载到宿主机的/home/admin/app。以后jar包有更新,丢到宿主机的/home/admin/app,然后重启容器即可。
    -d: 后台运行容器,并返回容器ID;
    -d, --detach=false Run container in background and print container ID
    -i: 以交互模式运行容器,通常与 -t 同时使用;
    -i, --interactive=false Keep STDIN open even if not attached
    -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    -t, --tty=false Allocate a pseudo-TTY
    6 、 将本地Java项目 package下 拖拽jar文件到 /home/liui/app路径下。postman测试
    打包时需要注意修改pom.xml文件,添加如下配置,否则运行时会提示找不到主函数错误。

     <build>
     <plugins>
     	    <plugin>
         	    <groupId>org.springframework.boot</groupId>
     	    	<artifactId>spring-boot-maven-plugin</artifactId>
     		</plugin>
     	</plugins>
     </build>
    

2 . Docker run mysql 时遇到错误:

  1. Error starting userland proxy: listen tcp4 0.0.0.0:3306: bind: address already in use
    https://blog.csdn.net/weixin_47872288/article/details/124774352
    执行命令关闭运行中的mysql: service mysql stop

  2. Failed to stop mysql.service: Unit mysql.service not loaded.
    通过命令:systemctl stop mysqld 成功关闭。

  3. Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json: dial unix /var/run/docker.sock: connect: permission denied
    通过 us 登录root用户才有docker权限

  4. docker ps 中 查看不到正在运行的mysql容器
    https://blog.csdn.net/footbridge/article/details/127988080
    docker ps -a 查看,发现容器是退出状态 然后重新运行一下
    docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7

  5. 2003 - Can’t connect to MySQL server on ‘192.168.126.177’ (10060 “Unknown error”)
    Navicat 还是无法连接容器中运行的mysql, 当前用户没有开放所有访问权,将 root 开放所有访问权
    https://blog.csdn.net/hkl_Forever/article/details/125454597
    第一步,给用户授所有访问特权,all代表所有权限(CRUD),*分别代表库名和表名,%代表所有访问IP

    mysql 5.x 授权方式
    grant all privileges on . to ‘root’@‘%’ identified by ‘root’;
    grant all privileges on . to ‘root’@‘%’ identified by ‘root’ with grant option;

    mysql 5.x 和 mysql 8.x 通用授权方式
    grant all privileges on . to ‘root’@‘%’ with grant option;

    为root用户授予所有库和表的(CURD)权限
    grant select, update, delete, insert on . to ‘root’@‘%’ with grant option;

    撤销root用户的所有权限
    revoke all privileges from root;

    第二步,刷新权限表
    flush privileges;

    切换数据库
    use mysql

    查看用户权限信息
    select user,host from user;

    查看用户是否授权成功
    show grants for ‘root’@‘%’;
    Navicat 依然连接失败,想到3306端口没有开放
    http://events.jianshu.io/p/d1dc5ac1b4b1
    centOs宿主机的端口设置在/etc/sysconfig/iptables文件中配置。
    cat /etc/sysconfig/iptables 命令查看 之前是开放过3306的
    [图片]
    这个配置没有生效 vim /etc/sysconfig/iptables 编辑配置文件 修改如下
    把-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT 放在下面的位置
    命令 service iptables restart 重启一下iptables 就好了 navicat测试连接成功。

  6. docker: Error response from daemon: driver failed programming external connectivity on endpoint myapp (036dab868d9290934dcaa6fd6f47fa3dbed76a5dbf5148856949ec4fd6b5a377): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8081 -j DNAT --to-destination 172.17.0.4:8081 ! -i docker0: iptables: No chain/target/match by that name.
    重启docker 就好了
    systemctl restart docker
    疑问?
    一个环境中安装多个mysql怎么区分使用?
    映射成两个端口号的mysql怎么区分?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

璃墟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值